You are on page 1of 338

UNIDAD 1: ARQUITECTURA GENERAL

OBJETIVOS

En el área de teoría de esta primera unidad vamos empezaremos aclarando algunos términos y
expresiones que, aunque se suelen emplear de forma indistinta, lo cierto es que tienen ciertas
connotaciones que los diferencian entre sí.

También hablaremos de los diferentes tipos de memoria que se emplean en los ordenadores en
general y en los microcontroladores en particular. Finalizaremos la unidad estudiando las dos arquitecturas
básicas que se emplean en la construcción de los microcontroladores. Una de ellas, la arquitectura Harvard,
es la empleada por los controladores PIC objetivo del presente curso.

En el área de prácticas vamos a hacer un repaso general de las diferentes herramientas hardware
disponibles para el desarrollo de aplicaciones basadas en controladores PIC. Utilizaremos algunas de ellas
para desarrollar los diferentes ejemplos que se proponen en el curso.

ÁREA DE TEORÍA

T-1.1 Aclarando ideas


T-1.1.1 Microprocesador
T-1.1.2 Microcomputador
T-1.1.3 Microordenador
T-1.1.4 Microcontrolador

T-1.2 Tipos de memoria


T-1.2.1 Memoria RAM
T-1.2.2 Memoria ROM
T-1.2.3 Memoria PROM
T-1.2.4 Memoria EPROM
T-1.2.5 Memoria EEPROM
T-1.2.6 Memoria FLASH
T-1.2.7 ¿Cuál debo usar?

T-1.3 Arquitectura de los controladores


T-1.3.1 Arquitectura Neumann
T-1.3.2 Arquitectura Harvard

ÁREA DE PRÁCTICAS

P-1.1 Introducción
P-1.2 Emuladores y depuradores
P-1.2.1 MPLAB-REAL ICE
P-1.2.2 ICD-3
P-1.2.3 PICkit-3
P-1.2.4 ICD-PIC

P-1.3 Grabadores
P-1.3.1 MPLAB-PM3
P-1.3.2 PIC Start Plus
P-1.3.3 USB-PIC’Burner

P-1.4 Tarjetas de evaluación


P-1.4.1 PICDEM2 Plus

1-1
www.mkelectronica.com Microcontroladores PIC: Nivel I
P-1.4.2 USB-PIC’School
P-1.4.3 PIC’Control

MATERIAL COMPLEMENTARIO

 Presentaciones en Power Point


o Lectura de memoria (o de un periférico)
o Escritura en un periférico (o en memoria)
o Arquitectura Neumann
o Arquitectura Harvard
 Video clips
o Presentación
o Arquitectura Neumann y Harvard
 Cuestionario

1-2
www.mkelectronica.com Microcontroladores PIC: Nivel I
AREA DE TEORÍA

T-1.1 ACLARANDO LAS IDEAS

Analiza por un momento el esquema por bloques de la figura. Se trata, ni más ni menos, del
esquema por bloques de un sistema informático completo, lo que conoces como ordenador.

Básicamente está compuesto de tres elementos fundamentales:

 La CPU o Unidad Central de Proceso: capaz de leer y ejecutar las instrucciones que forman un
programa.

 La memoria: donde se guarda tanto el programa como los datos y las variables.

 Los circuitos de interface: a través de los cuales se interactúa con el entorno exterior o periféricos
(teclado, pantalla, ratón, etc.).

Todos ellos se comunican entre sí mediante los


llamados “buses” de comunicación. Como en la figura, los
buses pueden tener diferentes aspectos y tamaños.
Pueden ser mangueras o mazos de cables o conjuntos de
pistas conductoras en un circuito impreso. Un bus no es
más que un conjunto de cables por donde circula
información binaria, o sea, señales eléctricas compuestas
de niveles “1”s y “0”s. En un ordenador se suele hablar de
tres buses fundamentales: “Bus de Direcciones”, “Bus de
Datos” y “Bus de Control”. A través del bus de direcciones
la CPU selecciona con qué dispositivo va a intercambiar
información en un instante. Dicho dispositivo puede ser un
determinado periférico o una zona de memoria concreta.
En cualquier caso, el dispositivo seleccionado puede ser
leído o escrito por la CPU, a una velocidad dada y con unas determinadas pautas. Esto lo determinan las
señales del bus de control que normalmente también son generadas por la CPU. Finalmente, a través del
bus de datos, circula la información propiamente dicha entre la CPU y la memoria o el dispositivo que
seleccionó previamente. Las animaciones de las presentaciones 1 y 2 hechas con Power Point, y que tienes
en el material complementario, te pueden servir para comprender mejor cómo la CPU realiza ciclos de
lectura o escritura.

Ahora me gustaría incidir en un pequeño detalle. Cuando hablamos de periféricos siempre nos
imaginamos los clásicos que rodean a un PC: teclado, pantalla, ratón, impresora, unidades de disco, etc...
Sin embargo el concepto de periférico es mucho más amplio. Piensa en un sistema informático encargado
de gobernar, por ejemplo, una máquina herramienta. Sus periféricos no tienen necesariamente porqué ser
los anteriormente mencionados. En este caso se trataría de controlar motores, sensores, indicadores, relés,
electroválvulas y un amplio abanico de dispositivos a los que también les debemos considerar como
periféricos.

1-3
www.mkelectronica.com Microcontroladores PIC: Nivel I
Seguramente quizá en tu entorno, en tu escuela, en el trabajo, etc..., al hablar de estas tecnologías,
has oído algunos términos que suenan de forma muy parecida pero que sin embargo tienen algunos
matices que los diferencian. Vamos a ver si puedo aclararlos de la forma más sencilla posible:

Microprocesador. Cuando usamos este término nos estamos refiriendo exclusivamente a la CPU, a la
Unidad Central de Proceso también conocida como “Núcleo”. Digamos que es el circuito electrónico
inteligente capaz de leer las instrucciones de un programa, hacer cálculos aritmético/lógicos, manipular
datos, etc… El objetivo final es el de realizar un determinado
trabajo o proceso. Su potencia y prestaciones están
determinadas básicamente por su velocidad de ejecución, el
número y tipo de instrucciones capaz de interpretar y el tamaño
de los datos que es capaz de manipular. Un microprocesador
de 16 bits manipula más información en la misma unidad de
tiempo, que la información que manipula un microprocesador
de 8 bits, pero menos que uno de 32 y mucho menos que la
información que manipula un microprocesador de 64 bits. De la
misma manera, un microprocesador que trabaja, por ejemplo, a
una velocidad de 40 MHz desarrollará un trabajo en mucho
menos tiempo que si trabajara a 20 MHz. Ya no te digo nada si
el microprocesador, como el Pentium de la figura, trabaja a
1.68 GHz (1680 MHz), o más.

Microcomputador. Piensa en un ordenador tipo PC, bien sea de sobremesa, portátil, o de bolsillo, como los
mostrados en la figura. Estamos hablando de una máquina que, por supuesto, está construida en torno a un
microprocesador o CPU como el de antes, al que se le ha conectado la memoria y los circuitos de interface
de E/S. Ahora bien, esta máquina no está diseñada con un propósito específico, sino más bien con un
propósito general. Efectivamente, tú sabes que un PC puede
realizar cualquier clase de trabajo en función del programa que le
cargues en un momento dado: gestión, contabilidad, proceso de
textos, control, gráficos, audio, vídeo, juegos y un sinfín de las
miles de aplicaciones y programas existentes. Esto es un
microcomputador. Por supuesto que estas máquinas han ido
creciendo y mejorando sus prestaciones al mismo ritmo que lo
han hecho los microprocesadores que las sustentan. Quizá
recordemos la evolución habida desde aquellos entrañables
microcomputadores como los TRS80, ZX81, Spectrum,
Commodore, etc., hasta llegar a los PC’s actuales.

Microordenador. También estaríamos hablando de una máquina con una estructura similar a la que viste
en la primera figura. La diferencia consiste en que en éste caso, esa máquina está
diseñada con un propósito concreto y único. Piensa en la clásica máquina de
“vending” expendedora de productos como la que se muestra en la figura. Está
claro que esta máquina sólo sirve para eso, para vender. Por supuesto que está
dotada de su correspondiente CPU con su correspondiente memoria en la que se
aloja el programa. Dicho programa tiene que ejecutar unas tareas muy concretas:
la gestión de venta, cobro del producto, devolución de cambios, etc… Por
supuesto que también tiene circuitos de interface para el control de sus periféricos
de E/S. En esta ocasión quizá no se traten de la clásica pantalla, una impresora,
un teclado o un ratón. Ahora los periféricos seguro que serán diferentes: displays
para visualizar precios, pulsadores para seleccionar un producto, monederos para
realizar el pago, tolvas para devolver el cambio, relés o electroválvulas para
entregar el producto, etc…, pero periféricos al fin y al cabo.

1-4
www.mkelectronica.com Microcontroladores PIC: Nivel I
Microcontrolador. De nuevo, estaríamos hablando de un dispositivo que
integra todos los elementos de un ordenador: CPU (en el argot se le suele
denominar núcleo), memoria y circuitos de interface con los periféricos. ¡¡
Un sistema completo en un único chip ¡! Su orientación es similar a la de los
microordenadores; es decir, se emplean con el objetivo de realizar un único
trabajo, aquel para el que ha sido programado. Sin embargo el precio y el
tamaño de un microcontrolador es mucho más reducido, lo que permite su
empleo masivo en sistemas y aplicaciones impensables hasta no hace
mucho. Aunque no los veamos, estamos rodeados de ellos: en teléfonos
móviles, en juegos, en alarmas, sensores, vehículos, automatismos, electrodomésticos, multimedia y en un
casi infinito número de productos de consumo. Su potencia quizá no se pueda comparar a la de un
microordenador, microcomputador o PC actual. Pero sólo es cuestión de tiempo. Cada vez integran CPU’s o
núcleos más rápidos y potentes de 8, 16 y 32 bits, más cantidad
de memoria tanto para programas como para datos, y más
circuitos de interface flexibles y versátiles para adaptarse a todo
tipo de periféricos. Todo ello integrado y con sus buses
debidamente conectados internamente, en una única pastilla de
silicio como la de la figura. Que sepas que a día de hoy existen
microcontroladores que son bastante más potentes que
aquellos ordenadores de los años 80. Si tienes la suficiente
edad, seguro que te acuerdas.

T-1.2 LA MEMORIA

Sin lugar a dudas toda CPU o núcleo, por potente y rápido que sea, está íntimamente ligado a la
memoria que lo rodea. Sin ella, la CPU no puede ejecutar programa alguno, ni manipular información ni, en
resumidas cuentas, realizar trabajo alguno. No sirve para nada. Es por ello que vamos a dedicar este
apartado a hablar de memorias.

Independientemente del tipo, de cómo esté construida y de su capacidad, en términos generales


podemos decir que existen dos clases de memorias según el uso que la CPU vaya a hacer de ellas.

 Memoria de programa. Es la memoria sobre la


que vas a guardar las instrucciones que forman el
programa que la CPU debe ejecutar. Obviamente
esas instrucciones se deben guardar de forma
secuencial, tal y como deben de ser ejecutadas.
Están formadas mediante códigos binarios legibles
por esa CPU. Ésta va leyendo esos códigos de
instrucción, los interpreta y ejecuta. Nos la
podemos imaginar como una especie de agenda o
dietario donde el programador ha escrito las
instrucciones o tareas a realizar.

 Memoria de datos. En ella se encuentran los


datos que la CPU, durante el curso de la ejecución
de un programa, va necesitando y/o produciendo.
Los datos pueden ser de tipo constante, si nunca
son modificados, o de tipo variable. Esta memoria
la puedes comparar con un bloc de notas donde
vas apuntando los datos que en un momento vas a
necesitar o los resultados parciales que vas
obteniendo.

La evolución tecnológica de las memorias es pareja a la evolución de los microprocesadores,


tratando así de cubrir las necesidades de éstos. Incluso se puede decir que un buen número de fabricantes
producen ambos tipos de componentes. Disponemos en el mercado de diferentes tipos de memoria para
contener tanto programas como datos según las necesidades de cada caso o aplicación.

1-5
www.mkelectronica.com Microcontroladores PIC: Nivel I
T-1.2.1 Memoria RAM

Se corresponde con las siglas en inglés de Random


Access Memory (memoria de acceso aleatorio).
Esencialmente se trata de una memoria sobre la cual, la CPU
puede leer o escribir datos en cualquier momento y en
cualquier lugar de la misma. Su contenido es volátil. Cuando le
falta la tensión de alimentación, toda la información que
contiene se verá modificada de forma irremediable. A efectos
prácticos es como si su contenido se hubiera borrado. Es ideal
para contener los datos variables que pueden ser manipulados
o modificados.

Según su constitución se pueden clasificar en dos


tipos diferentes:

 Estática. La célula básica capaz de almacenar la unidad básica de información, “el bit”,
está construida en base a un clásico circuito digital llamado “flip-flop tipo D”. Esas células
se organizan en registros, cada uno de los cuales puede tener a su vez 1 o varios flip-
flops. Suele ser muy frecuente hablar de nx1, nx4, nx8, nx16, etc.,
donde n es el número de registros y cada registro puede tener 1, 4, 8,
16, etc.. células o bits según el modelo. Una memoria de 2K x 8 indica
que tiene 2.048 registros (1K = 1024) de 8 bits cada uno, en total
16.384 células o flip-flops. Es una memoria fácil de controlar,
compleja de fabricar y algo más cara.

 Dinámica. La célula básica consiste en un condensador cuya carga o


descarga determina el bit de información “1” o “0”. También puede
estar organizada en n registros de n bits por cada uno de ellos.
Estamos hablando de una memoria RAM más sencilla de fabricar y,
por lo tanto más económica. Es capaz de alcanzar grandes
capacidades para almacenar información. Tiene un inconveniente: su
control es más difícil de realizar ya que periódicamente necesitan de ciertos ciclos de
refresco que evitan que los condensadores que forman sus células, se descarguen de
forma espontánea y pierdan la información.

T-1.2.2 Memoria ROM

Su nombre viene de Read Only Memory (memoria de sólo lectura). Se trata de una memoria cuyo
contenido permanece constante, incluso cuando falta la tensión de alimentación. Es tan fácil de controlar
como la memoria RAM estática, y también está organizada en n registros de n bits cada uno. La constitución
interna de cada célula es muy sencilla, por lo que puede
almacenar gran cantidad de información. Sin embargo, dicho
contenido sólo puede ser grabado durante el proceso de
fabricación del propio chip o circuito. Esto es una tarea cara y
compleja que sólo la puede realizar el fabricante. Es decir,
tenemos una memoria ideal para almacenar tanto datos
constantes como programas que no se borren nunca por la falta
de alimentación, pero muy cara a no ser que mandemos fabricar
la misma memoria en grandes cantidades. Es en estos casos
cuando el coste por chip se reduce drásticamente.

Este tipo de memorias se utilizaba bastante en los primeros


ordenadores personales o PC’s. En ellas venía grabado de
fábrica un programa, llamado “BIOS”, encargado de ejecutar las
tareas fundamentales cada vez que conectabas la tensión de alimentación, y de esta forma que el PC
“cobrara vida”.

1-6
www.mkelectronica.com Microcontroladores PIC: Nivel I
T-1.2.3 Memoria PROM

Es una versión de la ROM y sus siglas vienen de


Programmable Read Only Memory (memoria programable
de sólo lectura). Los fabricantes son conscientes de que
una memoria ROM, por cuestión de precio, no siempre
cubre las necesidades del usuario. Efectivamente, puedes
necesitar de una memoria que tenga las mismas
características que una ROM, pero precisas de pocas
unidades, por ejemplo de un único chip. Mandar a fábrica
que nos hagan una única memoria ROM con un contenido
que, seguramente sólo nos sirve a nosotros, es
sencillamente impensable. La solución pasa por el empleo
de las memorias tipo PROM.

Estas memorias vienen borradas de fábrica, por lo que en


principio sirven para todos los usuarios. Como se fabrican en grandes cantidades, el precio por chip es
bastante razonable. Posteriormente, cada usuario personaliza su PROM grabando sobre ellas su
información en particular. Para ello, emplea un “grabador” como el de la figura. Consiste en una máquina en
la que vas indicando qué información quieres grabar en cada uno de los registros internos de la memoria.

Una vez grabada, la memoria PROM se convierte en una ROM y ya no se puede volver a grabar. A
este tipo de memorias también se les conoce como OTP: One Time Programmable (programable una única
vez). Tienes por tanto una solución muy interesante y económica para aquellos casos en los que necesitas
de una memoria no volátil, pero en pequeñas cantidades. Eso sí, debes comprar un equipo grabador y no
son precisamente económicos.

En el mercado existen cantidad de modelos grabadores diferentes. Normalmente se conectan a un


PC desde donde se descarga la información a grabar. Los hay sencillos y económicos, capaces de grabar
unos pocos tipos de dispositivos. También los hay caros y de altas prestaciones, capaces de grabar no sólo
memorias PROM de diferentes capacidades, sino también todo tipo de dispositivos programables como
microcontroladores, PLD’s, GAL’s, FPGA’s, etc… de diferentes fabricantes.

T-1.2.4 Memorias EPROM

Con las siglas Erasable Programmable Read Only Memory (Memoria de sólo lectura programable y
borrable) se define a un tipo de memoria que tiene las mismas prestaciones que una PROM, pero que se
puede grabar varias veces previo borrado: la memoria EPROM.

Los fabricantes no tardaron en darse cuenta de que muchos


usuarios tenían necesidad de alterar el contenido de sus memorias PROM,
bien sea para mejorarlo, actualizarlo o modificarlo. En una PROM esto no
era posible y había que tirar el chip y grabar otro nuevo.

Aquí entran en juego las memorias EPROM. Memorias que, una


vez grabadas, presentan las mismas cualidades que sus predecesoras, la
ROM y la PROM. Sin embargo, ofrecen la posibilidad de ser borradas y
reutilizadas varias veces.

Para la grabación se emplean los mismos equipos que


para el caso de las PROM. Sin embargo, para su borrado,
este tipo de dispositivo dispone de una ventana
transparente en el propio encapsulado del chip. Fíjate en la
figura.

A través de ella, mediante un “Borrador de memorias”, se


le aplica una luz ultravioleta de una determinada longitud
de onda y durante un determinado intervalo de tiempo

1-7
www.mkelectronica.com Microcontroladores PIC: Nivel I
(varios minutos). En el mercado existen varios modelos de borradores similares al de la figura. Básicamente
consisten en un recipiente o caja donde se introduce la memoria EPROM a borrar, una lámpara de luz
ultravioleta y un temporizador que permite ajustar el tiempo de exposición del chip a la luz. Tras el borrado
la memoria queda como al principio, con lo que se le puede someter a otro ciclo de grabación.

Ahora bien, no debes confundir o equiparar una EPROM con una RAM por aquello de que se puede
leer y escribir varias veces. No tienen nada que ver la una con la otra. He aquí varias diferencias
fundamentales:

1. Una RAM se puede leer y escribir en infinitas ocasiones. Una EPROM también se puede
leer en infinitas ocasiones pero el número de ciclos de borrado/escritura es muy limitado.
Los fabricantes aconsejaban no hacerlo en más de 6 u 8 ocasiones, pues se corre el
riesgo de que la información almacenada se vuelva inestable y se modifique
aleatoriamente.

2. Una memoria RAM es leída y escrita directamente por el microprocesador o CPU. Una
EPROM también es leída por la CPU, pero ésta no puede escribir sobre ella. Para escribir
una EPROM es necesario sacarla del circuito, borrarla mediante luz ultravioleta,
reescribirla mediante un grabador externo y volver a insertarla en el circuito.

3. En una RAM, cada ciclo de lectura y/o escritura lo realiza la CPU en intervalos de tiempo
-9
de algunos pocos nanosegundos (1nS = 10 segundos). El ciclo de lectura de una
EPROM lo realiza la CPU también en unos pocos nS, pero el ciclo de borrado/escritura
necesita de varios minutos.

T-1.2.5 Memoria EEPROM

El nombre de estas memorias es el acrónico de


Electrically Erasable Programmable Read Only Memory
(memoria de sólo lectura programable y borrable
eléctricamente) y supuso un gran avance en la tecnología de las
memorias y, por supuesto, en el mundo de los
microprocesadores y microcontroladores.

Este tipo de memorias una vez grabadas, actúan de igual manera que las típicas memorias ROM.
Ahora bien se borran eléctricamente, por lo que no es necesario someterlas al “baño” de luz ultravioleta.
Basta con aplicarle una serie de órdenes o señales eléctricas por determinadas patillas. Incluso, esas
órdenes o señales, pueden servir también para su grabación y las puede generar la mismísima CPU. Por fin
disponemos de un dispositivo reutilizable que, además de poder leer la información no volátil que contiene,
se puede borrar y grabar con la intervención del propio microprocesador. No es imprescindible el empleo de
grabadores ni de borradores.

En cualquier caso volvemos presentar dos poderosas razones para no confundir ni equiparar una
memoria EEPROM con una RAM:

1. El número de veces que se puede realizar el borrado/escritura de una EEPROM se


encuentra entre 100.000 y 1 millón de ciclos. Como vemos es mucho más que lo que se
podía realizar con una EPROM, pero en ningún caso alcanza el ilimitado número de ciclos
de escritura que se pueden practicar con una memoria RAM.

2. Los tiempos de borrado o escritura sobre una EEPROM mejoran ostensiblemente


respecto a los de la EPROM predecesora, y se cifra en unos pocos milisegundos (1mS =
-3
10 seg.). En el caso de la RAM recordamos que, a pesar de todo, un ciclo de escritura se
realiza en intervalos del orden de los nanosegundos.

1-8
www.mkelectronica.com Microcontroladores PIC: Nivel I
T-1.2.6 Memoria FLASH

Este tipo de memoria es una forma avanzada de la memoria EEPROM creada por el Dr. Fujio
Masuoka en 1984 y comercializada a partir de 1988. A día de hoy es, de las memorias no volátiles, loa más
utilizada. Reúne todas las ventajas de una memoria EEPROM a la que se añade una notable mejora como
es la reducción en el tiempo necesario para realizar un ciclo de borrado y escritura (de ahí su nombre).
Disponemos ya de una memoria no volátil, que se puede reutilizar varias miles de veces, a una velocidad
más que interesante y que es capaz de albergar grandes cantidades de información. Además, se puede
grabar y/o borrar insertada en el propio circuito y sin necesidad de complejos y caros grabadores y
borradores.

Su empleo se ha masificado de tal manera, que se fabrican en grandes cantidades, lo que conlleva
una reducción de su precio, lo que a su vez aumenta su consumo, que a su vez...

Podemos decir que, las memorias PROM, EPROM y EEPROM de las que hemos hablado antes,
han pasado casi a la historia. Apenas se emplean a día de hoy y están siendo sustituidas por las memorias
FLASH. Así pues, teniendo en cuenta que la evolución de los micros y las memorias van al mismo ritmo,
podemos afirmar que la mayor parte de microcontroladores que se consumen en la actualidad, incorporan
también este tipo de memoria.

Una muestra de su popularidad y consumo es el que todo


el mundo la ha utilizado, quizá sin saberlo, en alguna ocasión. Mira
algunos ejemplos como los de la figura:

 La memoria de nuestro teléfono móvil


 Nuestro reproductor de MP3
 El navegador GPS que llevamos en el coche
 Los “Pen Drivers” que conectamos en nuestro PC y que
sustituyen a los legendarios disquetes.

Si pensamos en estos dispositivos veremos que, efectivamente, contienen algún tipo de memoria no
volátil pero reutilizable. Cada vez que enciendes el móvil, el reproductor o el navegador GPS nos
encontramos con nuestra agenda, nuestras canciones y nuestros mapas de carreteras. Sin embargo de
todos es sabido que esa agenda la podemos modificar añadiendo nuevos amigos o eliminando a aquellos
que dejaron de serlo. También nos podemos aburrir de escuchar siempre las mismas canciones y por ello
las cambiamos por otras en nuestro reproductor MP3. De igual manera podemos modificar y/o actualizar los
mapas de carreteras de nuestro navegador GPS. Y qué decir de los Pen Drivers que nos llevamos de un
lado para otro para intercambiar información. ¡Estas son algunas de las aplicaciones comerciales de la
memoria FLASH!

T-1.2.7 ¿Cúal debemos usar?

Parece una pregunta “trampa”. En primer lugar debes saber que las
memorias se dividen en dos grandes grupos: la volátil o memoria RAM y la no
volátil o memoria ROM (o cualquiera de sus versiones PROM, EPROM, EEPROM
o FLASH). En segundo lugar tiene que quedarte claro que el microprocesador o
CPU NO sabe distinguir si está conectado a una memoria RAM o a una memoria
ROM (o a sus diferentes versiones).

La CPU se limita a ejecutar las instrucciones del programa y a manipular


los datos en el orden apropiado. No sabe de dónde le llegan esas instrucciones ni
esos datos. Es tarea del programador, o sea la tuya, preocuparse de que cada
cosa le llegue en la secuencia necesaria. También es tarea del diseñador determinar qué tipo y cantidad de
memoria necesita emplear en su proyecto. Lo que sí podemos afirmar es que cualquier equipo informático

1-9
www.mkelectronica.com Microcontroladores PIC: Nivel I
tiene siempre ambos tipos de memoria. Vamos a analizar qué memoria debemos utilizar en función del tipo
de máquina.

Microcomputador. Imaginemos por ejemplo el típico


PC. Esta máquina está destinada a ejecutar en cualquier
momento cualquiera de los programas que le
carguemos: un juego, un procesador de textos, un
programa de contabilidad, o de diseño, etc. Es obvio que
necesitamos que esta máquina disponga de gran
cantidad de memoria RAM como memoria principal, ya
que es la única memoria que se puede leer y escribir un
ilimitado número de veces. Sin embargo, ésta es una
memoria volátil y ya sabes lo que te pasa cuando falla la alimentación... . Por otra parte, cada vez que
vuelves a conectar el PC, ves que se inician algunos procesos como son los test de memoria, de pantalla,
de unidades de disco y, finalmente, la carga del sistema operativo. ¿Dónde se encuentran estas tareas?
Pues debes suponer que en memoria no volátil de tipo ROM (o cualquiera de sus versiones). Es decir en
esta ROM se encuentran las tareas básicas que el PC debe realizar nada más conectarse. Habrás oído
referirse a ellas como la “BIOS” (Basic Input Output System).

Así pues, en un microcomputador nos conviene disponer de abundante memoria RAM para guardar
datos y programas variables, pero también tendremos algo de memoria ROM, para contener los datos y
programas constantes, que se deben ejecutar siempre que se conecte la tensión de alimentación al equipo.

Microordenador. Acuérdate de la máquina de “Vending”. Por su propia


naturaleza, esta máquina está pensada para ejecutar una única tarea:
vender productos. Es de suponer que en este tipo de máquinas la memoria
principal será del tipo ROM (o sus versiones). En ella se almacenará de
forma permanente los datos y el programa que debe ejecutarse nada más
encenderla. Ahora bien, esto no implica que no tenga memoria RAM, donde
se irán guardando los datos variables o temporales que se van obteniendo
en el curso de su trabajo, por ejemplo los cambios que debe devolver en
cada venta.

En un microordenador nos conviene pues disponer de abundante


memoria ROM para guardar el programa que se debe ejecutar así como los
datos constantes. También hay algo de memoria RAM para almacenar
datos variables.

Microcontrolador. Estamos hablando de un microordenador pero


integrado en un único chip. Así pues tiene la misma orientación. La
memoria ROM (o sus diferentes versiones) actuará como memoria
principal para almacenar el programa que se debe ejecutar, así como
los datos de carácter constante. Generalmente se suele hablar de
“memoria de programa”. También tendrá algo de memoria RAM para
almacenar los datos variables o temporales que se van produciendo en
el curso de esa ejecución. Se le suele denominar como “memoria de
datos”.

T-1.3 ARQUITECTURA DE LOS CONTROLADORES

Ya hemos ido aclarando poco a poco las ideas y conceptos genéricos que ahora vamos a aplicar a
los microcontroladores objetivo de este curso. Empezaremos diciendo que la velocidad, potencia,
prestaciones y precio de un microcontrolador viene determinada por el tipo de CPU o núcleo que integra,

1-10
www.mkelectronica.com Microcontroladores PIC: Nivel I
por la cantidad de memoria, tanto de programa como de datos que posee y por el tipo de circuitos de
interface que dispone para el control de los periféricos:

 Núcleo o CPU. Existen microcontroladores con núcleos de 8, 16 y, hasta el momento, 32


bits. Con esto se determina el volumen de información que es capaz de manipular en una
misma unidad de tiempo. Lógicamente, de cuantos más bits sea un núcleo, más rápido
será en la gestión de esa información. Otro factor importante es la velocidad de trabajo.
Con ella se determina la unidad de tiempo en la que se ejecuta cada operación. Nos
podemos encontrar con núcleos que trabajan desde unos cuantos KHz hasta unas
decenas de MHz.

 Memoria de Programa. Los hay con mucha o poca memoria, en función de lo complejo y
grande que sea el programa a ejecutar. Elegimos el que mejor encaje en nuestra
aplicación o proyecto. Podemos afirmar que, a día de hoy, el tipo de memoria de programa
que más se emplea en los microcontroladores actuales es la del tipo Flash.

 Memoria de Datos. De igual manera, los hay con mucha o poca memoria, en función de
los datos variables o temporales que vamos a necesitar. Por lo general la memoria de
datos es del tipo RAM volátil, aunque cada vez es más frecuente añadir también memoria
EEPROM para albergar datos no volátiles pero que se puedan modificar.

 Interface. Se comercializan sencillos y económicos microcontroladores que disponen de


simples señales de E/S digitales para el control de sencillos periféricos. También los hay
que integran otros circuitos de interfaces para el control de diferentes tipos de periféricos:
convertidores ADC, convertidores DAC, modulación PWM, comunicación serie UART, SPI,
I2C, temporizadores, etc.

Otro factor que define las características de un microcontrolador es su arquitectura interna, que
determina la forma en que tanto la memoria de programa, como la memoria de datos y los circuitos de
interface, se conectan con el núcleo o CPU: arquitectura “Neumann” o arquitectura “Harvard”. Vamos con
ellas.

T-1.3.1 Arquitectura Neumann

Esta arquitectura debe su nombre a su diseñador, John von Neumann,


matemático Húngaro-Estadunidense nacido en 1903. En la década de los 40,
al final de la segunda guerra mundial, empezó a interesarse por la ciencia
computacional, involucrándose en la construcción del ENIAC. Crea las bases
de lo que posteriormente sería la popular “Arquitectura Neumann” usada en la
construcción de los ordenadores.

Es quizá la más extendida tanto en el mundo de los microcomputadores,


como en los microordenadores y en los microcontroladores. Su esquema por
bloques se muestra en la siguiente figura.

1-11
www.mkelectronica.com Microcontroladores PIC: Nivel I
En este tipo de arquitectura se dispone de un juego de tres “buses” o grupos de señales, con los
que el núcleo o CPU se comunica con el resto de los componentes que forman el microcontrolador:

 Bus de direcciones. A través de sus señales el núcleo selecciona en todo momento a


qué posición de un determinado componente desea acceder: a la memoria de programa
cuando el núcleo necesite extraer la instrucción que se debe ejecutar, a la memoria de
datos cuando se necesite guardar o recuperar una determinada información, o a los
circuitos de interface cuando se vaya a transmitir o recabar información de un periférico
externo.

 Bus de datos/instrucciones. Transporta las señales digitales que codifican las


instrucciones y/o los datos y que circulan entre el núcleo y el componente seleccionado.
Según este bus sea de 8, 16 o 32 líneas, así será el número de bits de información que
transporta y manipula en una misma unidad de tiempo.

 Bus de control. Está compuesto de una serie de señales con las que el núcleo o CPU
informa si va a leer o escribir el componente seleccionado, si va acceder a la memoria o a
los periféricos, a qué velocidad lo va a realizar, etc.

La mayor ventaja de esta arquitectura radica en su sencillez y por tanto en su economía. Los
mismos buses se emplean para comunicar a todos los componentes con el núcleo, con lo cual, el hardware
o conexiones eléctricas que hay que realizar,se simplifican.

Sin embargo esa ventaja también se puede convertir en un inconveniente. Efectivamente, al


compartirse los buses con la memoria de programa, con la de datos y con los circuitos de interface, resulta
imposible comunicarse con más de uno de esos componentes al mismo tiempo. Cuando el núcleo extrae
una instrucción de la memoria de programa, no puede acceder a la memoria de datos ni a los periféricos. De
la misma manera cuando el núcleo accede, por ejemplo, a la memoria de datos, no puede extraer una
instrucción de la memoria de programa.

El trabajo del núcleo es muy metódico y secuencial. Se divide en dos fases:

1. Fase de búsqueda. El núcleo emplea los buses para extraer de la memoria de programa
la instrucción que debe ejecutar, así como sus correspondientes parámetros.

2. Fase de ejecución. El núcleo decodifica y ejecuta la instrucción recién leída. Es en este


momento cuando el núcleo emplea los buses para guardar o extraer información, tanto de
la memoria de datos como de los periféricos a través de los circuitos de interface.

Terminada la ejecución de una instrucción el núcleo entra de nuevo en fase de búsqueda de la


siguiente y así sucesivamente, hasta completar la totalidad de instrucciones que componen el programa.
Por supuesto, es tarea del programador asegurarse de que tanto las instrucciones como los datos se
proporcionan en el orden adecuado. De no ser así, sencillamente, el núcleo pierde el hilo de la ejecución y
los resultados pueden ser impredecibles.

Con ayuda de la siguiente figura voy a tratar de describir lo explicado empleando un sencillo
programa de ejemplo. Se trata de sumar dos datos (A+B). El dato A se encuentra en la posición 35 de la
memoria de datos y vale 18, el B se encuentra en la posición 36 y vale 23. El resultado de la suma (41) se
lleva al circuito de interface nº 10 de salida. Por otra parte fíjate que el programa con sus instrucciones y
parámetros, se encuentra en la memoria de programa, a partir de la posición o registro número 0.

1-12
www.mkelectronica.com Microcontroladores PIC: Nivel I
Veamos a numerar los pasos que va a realizar el núcleo o CPU para ejecutar este sencillo programa
de ejemplo. Estúdialos con cuidado y repásalos las veces que te haga falta. Quizá te ayuden las
animaciones que tienes en las presentaciones 3 - 9 hechas con Power Point en el material complementario.

PASO FASE DESCRIPCIÓN


1 Búsqueda Por el bus de direcciones se selecciona la 1ª posición de la memoria de
programa, la 0. Mediante el bus de datos/instrucciones la CPU lee la
instrucción “Cargar”. Mediante un segundo acceso a la siguiente dirección, la
1, se lee su parámetro: el valor 35, que se corresponde con el lugar donde se
encuentra el dato A.
2 Ejecución Por el bus de direcciones aparece la dirección 35 de la memoria de datos.
Esta responde con el valor 18 del dato A, que se introduce a la CPU a través
del bus de datos
3 Búsqueda Por el bus de direcciones se selecciona la siguiente dirección de la memoria
de programa donde se encuentra la siguiente instrucción, la 2. Por el bus de
datos/instrucciones se lee la instrucción “Sumar”. Mediante un segundo
acceso a la siguiente dirección, la 3, se lee su parámetro: el valor 36, que se
corresponde con el lugar donde se encuentra el dato B
4 Ejecución Por el bus de direcciones aparece la dirección 36 de la memoria de datos.
Esta responde con el valor 23 del dato B, que se introduce en la CPU
mediante el bus de datos. Realiza la suma
5 Búsqueda Por el bus de direcciones se selecciona la siguiente dirección de la memoria
de programa donde se encuentra la siguiente instrucción, la 4. Por el bus de
datos/instrucciones se lee la instrucción “Salida”. Mediante un segundo acceso
a la siguiente dirección, la 5, se lee su parámetro: el valor 10, que se
corresponde con la dirección del periférico o puerto de salida.
6 Ejecución Por el bus de direcciones aparece la dirección 10. Por el bus de control se
generan las señales de escritura en periféricos. Por el de datos aparece el
resultado de la suma anterior, 41, que se escribe sobre el periférico de salida
indicado, el 10.

T-1.3.2 Arquitectura Harvard

Originalmente “Harvard” hacía referencia


a computadoras en cuyas arquitecturas se
utilizaban dispositivos de almacenamiento
(memorias) físicamente separados entre sí, a
diferencia que en la arquitectura de von
Neumann. Se empleaba una memoria
exclusivamente para contener las instrucciones
del programa, y otra sólo para los datos. El
término proviene de la computadora modelo
Harvard Mark I de IBM, que almacenaba las
instrucciones en cintas perforadas y los datos en
interruptores.

1-13
www.mkelectronica.com Microcontroladores PIC: Nivel I
Quizá sea menos extendida y conocida, pero no por ello deja de ser interesante y muy eficaz. Es la
que emplean los microcontroladores PIC de Microchip objeto de este curso, y a los que poco a poco vas a ir
llegando.

En este tipo de arquitectura se diferencia claramente el área o memoria de programa del área o
memoria de datos. La primera consta de una memoria de sólo lectura que, a día de hoy, es normalmente del
tipo Flash. Al hablar del área de datos nos referimos tanto a la memoria RAM como a los circuitos de
interface con los periféricos. Analiza la siguiente figura.

Podemos decir que esta arquitectura, a nivel de hardware, es más compleja y por lo tanto más cara.
Consta de dos juegos con tres buses cada uno:

 Buses para el área de datos. Son similares a los buses de la arquitectura Neumann. Un
bus de direcciones para seleccionar el registro o posición al que la CPU va a acceder. Un
bus de datos a través del cual circula la información hacia/desde la CPU y el registro o
posición seleccionado. Esta posición puede ser de memoria RAM, o bien de los circuitos
de interface de periféricos. Por último está el bus de control con las señales pertinentes
(lectura, escritura, reloj, etc.).

 Buses para el área de programa. Suponen la nueva aportación de esta arquitectura. Un


bus de direcciones exclusivamente para seleccionar los registros o posiciones de la
memoria de programa. Un bus de instrucciones por donde circulan las instrucciones desde
la memoria de programa hacia la CPU o núcleo. Un bus de control con las señales
pertinentes (lectura, reloj, etc.).

Como aspecto negativo podemos comentar la complejidad de esta arquitectura a nivel de hardware.
Al disponer de dos juegos de buses diferentes las conexiones eléctricas a realizar entre el núcleo o CPU y
los demás componentes son más numerosas, complejas y costosas. Ahora bien, para nosotros esto no será
ningún problema. Estamos hablando de microcontroladores en los que todo ello está integrado en un
único chip y debidamente conectado.

Sin embargo podemos citar unos cuantos aspectos positivos:

1. Al tener buses separados, es fácil intuir que la CPU puede acceder al área de programa y
al área de datos de forma simultánea, al mismo tiempo.

2. La anchura o número de bits por cada registro o posición puede ser diferente en el área de
programa que en el área de datos. Es decir el bus de instrucciones puede tener por
ejemplo, 14 bits, y el de datos 8.

1-14
www.mkelectronica.com Microcontroladores PIC: Nivel I
3. Al poder disponer de un bus de instrucciones con más bits, una instrucción puede codificar
más información en sí misma e incluir, no sólo su propio código, sino también los
parámetros u operandos que necesite. De esta forma, en un único acceso al área de
programa la CPU extrae la instrucción completa. En la arquitectura Neumann pueden
hacer falta dos o más ciclos de acceso.

4. Como una instrucción puede codificar más información en sí misma, es posible diseñar
instrucciones más compactas, completas y potentes. Es decir, una misma instrucción en
una arquitectura Harvard puede realizar el trabajo equivalente a dos o más instrucciones
distintas de una arquitectura Neumann.

5. Por ese motivo puedes deducir que una arquitectura Harvard necesita menos
instrucciones que una arquitectura Neumann. A esto también se le conoce como
arquitectura RISC, Reduced Instrucction Set Code (juego de instrucciones reducido).

6. La arquitectura Harvard permite la ejecución “Pipe-Line”. Efectivamente, al disponer de


buses separados es posible solapar la fase de búsqueda de una instrucción con la fase de
ejecución de la instrucción previa. Conseguimos así que en un único ciclo de acceso, se
busque una instrucción completa y se ejecute otra, la anterior.

Todo ello lo podemos resumir mediante un sencillo programa de ejemplo, idéntico al que viste para
la arquitectura Neumann, y que se muestra en la figura. Se trata de sumar dos datos (A+B). El dato A se
encuentra en la posición 35 del área de datos y vale 18, El dato B se encuentra en la posición 36 y vale 23.
El resultado de la suma (41) se lleva al circuito de interface nº 10 de salida. El programa con sus
instrucciones y parámetros se encuentra en el área de programa, a partir de la dirección o registro n º 0.
Merece la pena que te detengas a comparar este ejemplo, con el equivalente anterior. Analiza paso a paso
la forma de proceder de nuestra arquitectura Harvard a la hora de ejecutar el ejemplo. También te puedes
servir de las animaciones de 10 - 14, hechas con Power Point y que tienen en el material complementario.

1. En un primer ciclo no hay nada previo que ejecutar. Se realiza únicamente una fase de
búsqueda. El núcleo proporciona la primera dirección del área de programa, la 0, para
extraer la primera instrucción: “Cargar 35” (cargar el dato que hay en la posición 35 del
área de datos). Observa que en un único ciclo de acceso al área de programa, se extrae la
instrucción completa: el código de la instrucción “Cargar” y su operando o parámetro (35).

2. En el segundo ciclo se realizan, al mismo tiempo, la fase de búsqueda de la siguiente


instrucción y la fase de ejecución de la previa. En la fase de búsqueda el núcleo
proporciona la siguiente dirección del área de programa, la 1, de donde extrae la siguiente
instrucción: “Sumar 36” (sumar el dato que hay en la posición 36 del área de datos). En la
fase de ejecución se ejecuta la instrucción anterior. Para ello, la CPU ofrece por el bus de
direcciones la dirección 35 del área de datos de donde extrae el valor a cargar, el 18.

1-15
www.mkelectronica.com Microcontroladores PIC: Nivel I
3. En el tercer ciclo se realizan, al mismo tiempo, la fase de búsqueda de la siguiente
instrucción y la fase de ejecución de la previa. En la fase de búsqueda el núcleo
proporciona la siguiente dirección del área de programa, la 2, de donde extrae la siguiente
instrucción: “Salida 10” (sacar el resultado por la posición 10 de los circuitos de interface).
En la fase de ejecución se ejecuta la instrucción anterior. Para ello, el núcleo saca por el
bus de direcciones la dirección 36 del área de datos de donde extrae el valor a sumar, el
23. Realiza la suma.

4. En el siguiente ciclo se realizan al mismo tiempo la fase de búsqueda de la siguiente


instrucción y la fase de ejecución de la previa. En la fase de búsqueda el núcleo
proporciona la dirección del área de programa, la 3, de donde extraería la siguiente
instrucción. En la fase de ejecución se ejecuta la instrucción anterior. El núcleo ofrece por
el bus de direcciones la dirección 10 de los circuitos de interface y envía el resultado de la
suma, el 41.

5. El proceso se repite indefinidamente.

En el vídeo “Arquitectura” que tienes en el material complementario de esta unidad, se resume todo
lo que has estudiado sobre las fases de búsqueda y ejecución en las arquitecturas Neumann y
Harward.

1-16
www.mkelectronica.com Microcontroladores PIC: Nivel I
AREA DE PRÁCTICAS

P-1.1 INTRODUCCIÓN

Al igual que con cualquier otra disciplina,


el empleo de tecnologías basadas en los
microcontroladores requiere de una serie de
herramientas, tanto hardware como software que
faciliten el diseño, depuración y puesta a punto de
nuestra aplicación o proyecto final. Los PIC’s no
son una excepción y por ello, tanto Microchip
como otros fabricantes de electrónica y/o de
software, ponen a nuestra disposición una serie de
herramientas con un único objetivo: facilitar la
puesta a punto de un proyecto en el menor tiempo
de diseño posible, y por tanto, con un menor coste
final del producto. Este tipo de herramientas se
pueden clasificar en diferentes grupos:

 Grabadores. Son equipos que te permiten grabar la memoria del microcontrolador con el
programa que has diseñado para un determinad proyecto. En el argot de los
microcontroladores a este programa se le suele denominar “Firmware” para diferenciarlo
del término “software” que, quizá, está más relacionado con el mundo de los PC’s.
Quédate con esta expresión ya que la voy a utilizar con cierta frecuencia. Existen gran
cantidad de modelos diferentes. Hay grabadores de producción que, además de grabar
uno o varios PIC’s al mismo tiempo, son capaces de chequear diferentes condiciones de
trabajo del dispositivo: alimentación, velocidad, etc. Son caros y se justifican cuando hay
que grabar muchos dispositivos como, por ejemplo, en una cadena de montaje. También
hay grabadores apropiados para su uso en laboratorios, centros de investigación o
enseñanza. Son bastante económicos y pueden grabar prácticamente todos los
dispositivos existentes, pero son lentos y no someten al PIC a todas las posibles
situaciones de trabajo. También hay grabadores de muy bajo coste ideal para estudiantes
y aficionados en general. Quizá no graben todos los modelos existentes, pero casi seguro
que sí los más importantes. Su relación calidad-precio es muy interesante.

 Emuladores/Depuradores. Así como un grabador simplemente se limita a grabar, los


emuladores y/o depuradores ofrecen una serie de recursos y opciones que facilitan
enormemente la puesta a punto del firmware antes de grabarlo en el chip. Un emulador
permite la ejecución de nuestro programa (firmware) en tiempo real. También permite la
ejecución paso a paso, instrucción a instrucción, pudiendo así analizar la evolución del
programa y localizar posibles fallos en el mismo. Puede visualizar y/o modificar los
registros internos, interactuar directamente con los periféricos, ejecutar puntos de parada,
capturar y trazar los diferentes estados y ciclos por los que ha pasado el controlador en el
curso de la ejecución, medir lapsus de tiempo de ejecución, capturar señales externas y
mucho más. Es la herramienta con mayúsculas empleada por Ingenierías y Centros de
Desarrollo. Su precio también es mayúsculo. Una opción intermedia son los llamados
depuradores. Quizá no dispongan de todos los recursos que tiene un emulador, o en la
misma cuantía que aquel, pero sí los más importantes. Su precio es muy interesante y,
poco a poco, su uso se va popularizando. Esto es posible gracias a que a su vez los
microcontroladores más modernos también ayudan, pues disponen de mecanismos
internos propios para la depuración.

 Tarjetas de evaluación. Son tarjetas electrónicas diseñadas por el propio fabricante o por
terceras fuentes. Su objetivo es permitir evaluar las características y propiedades de un
determinado dispositivo de una forma rápida y eficaz. Contienen una serie de periféricos
con los que poder desarrollar programas de experimentación y probar así los recursos que
integra un determinado modelo de controlador.

1-17
www.mkelectronica.com Microcontroladores PIC: Nivel I
 Software. Tanto los grabadores, como los emuladores o los depuradores, son máquinas
que normalmente se controlan a través de un PC dotado del software correspondiente. A
este software lo debes considerar como una herramienta más a emplear en tu diseño. Por
esto, y porque normalmente con este tipo de software vas a poder editar (escribir) tu
programas fuente, ensamblarlo y/o compilarlo. Incluso existe software que te permite la
simulación de la ejecución del programa sin tan siquiera disponer de controlador alguno.
Se llaman simuladores. Microchip lo
ofrece gratis para todos sus
dispositivos PIC de todas sus
familias. Lógicamente no es un
emulador ni un tan siquiera un
depurador, pero sí una herramienta
que ayuda, y mucho, a analizar el
comportamiento de un PIC cuando
ejecuta un programa. Nosotros lo
vamos a emplear en los primeros
ejemplos y nos va a facilitar el
estudio de las instrucciones. Dentro
de las herramientas software de
desarrollo quizá debiéramos incluir
también a los compiladores. Se trata
de herramientas que permiten la
programación en un lenguaje de alto
nivel que, lógicamente, facilitan las
tareas de programación.

Como en este curso vamos a estudiar los microcontroladores PIC, en los siguientes apartados te
voy a presentar algunas de las herramientas empleadas para el desarrollo de proyectos basados en ellos.

P-1.2 EMULADORES Y DEPURADORES

Los emuladores y depuradores son auténticas herramientas de diseño pensadas y dotadas de los
mecanismos necesarios para facilitarte la puesta a punto de tu programa de aplicación o firmware. El
objetivo de depurar un programa es localizar y corregir todos los posibles fallos que pudiera tener. Esto se
convierte en un auténtico desafío. Es aquí donde vas a invertir una gran cantidad de tiempo y poner a
prueba todas tus habilidades, recursos y experiencia. Pero tómalo con calma y con paciencia. Para esto
están estas herramientas, para ayudarte en esa difícil y a veces pesada tarea.

En términos generales, los emuladores y/o depuradores nos permiten, de alguna manera, “abrir” un
controlador para analizar, modificar y “jugar” con todas sus “tripas”. Por un lado están conectados con el
hardware o tarjeta electrónica de nuestra aplicación o proyecto, y por otro con el PC donde disponemos de
todas las opciones propias para la emulación/depuración.

P-1.2.1 MPLAB-REAL ICE

Es la herramienta actual más potente y flexible


(y cara) original de Microchip. Con ella puedes depurar
o emular cualquiera de los controladores PIC más
actuales con tecnología flash. Todas las tareas las
realizas mediante un entorno de trabajo potente e
intuitivo como es el MPLAB-IDE.

El MPLAB-REAL ICE se conecta por un lado


directamente con el PC, usando para ello un puerto
USB. Por otro lado se conecta con la tarjeta electrónica
que contiene el controlador, llamado “Target” (objetivo),
y cuyo programa deseas depurar y poner a punto.

1-18
www.mkelectronica.com Microcontroladores PIC: Nivel I
Esta herramienta puede actuar como
depurador y se denomina ICD (In Circuit
Debugger). En este caso se conecta directamente
con el PIC objetivo o Target. Este estará
insertado en la tarjeta electrónica de tu proyecto y
no es necesario que lo retires de ella. El
programa se transfiere y se ejecuta en dicho PIC.
Algunas de las patillas de E/S de éste quedan
bajo el control del depurador y no pùedes
disponer de ellas.

También puede actuar como emulador ICE (In


Circuit Emulator). La emulación consiste en
retirar literalmente el PIC del hardware o tarjeta
electrónica de tu proyecto (Target). Se sustituye
por las señales que ofrece el módulo procesador
que, a todos los efectos, es 100% equivalente
con el PIC retirado. La diferencia radica en que
nuestro programa o firmware se ejecuta sobre el
módulo procesador por lo que disponemos de
todas las patillas de E/S del PIC.

Con el MPLAB-REAL ICE, puedes realizar tareas tales como:

 Visualizar y/o modificar todos y cada uno de los registros internos del PIC, ya sean del
área de memoria RAM de datos, del área EEPROM de datos, del área FLASH de
programa, valores de configuración, registros SFR, etc. En resumidas cuentas TODO.

 Ejecución en tiempo real. El firmware se ejecuta tal y como lo haría en el propio PIC.
Como el emulador está conectado con la tarjeta electrónica de tu proyecto, todos los
periféricos que estuvieran conectados en ella se verán afectados por la ejecución de ese
firmware, actuando en tiempo real. Si ejecutas por ejemplo, una instrucción para encender
un led, verás que efectivamente el led se enciende.

 Ejecución paso a paso. El firmware se va ejecutando instrucción a instrucción. Con cada


instrucción ejecutada puedes analizar los resultados que se generan en los registros
internos, periféricos, etc… Puede ser muy tedioso si el programa fuera muy largo, pero
has de reconocer que es la forma de saber exactamente qué instrucción o instrucciones
fallan y no ofrecen el resultado esperado.

 Ejecución por bloques. Puedes hacer que un conjunto de instrucciones contenidas en lo


que se llama una “subrutina” o “función”, se ejecuten en tiempo real y luego el sistema se
detenga. Ahora puedes hacer un análisis exhaustivo de los resultados obtenidos.

 Ejecución con puntos de parada. También puedes hacer que la ejecución de un


programa se detenga al llegar a un determinado punto o “breakpoint”. Los puntos de
parada los puedes establecer de múltiples formas. Por ejemplo, le puedes decir que el
sistema se detenga al llegar a una determinada dirección o instrucción. También hay
formas complejas. Por ejemplo, le puedes decir que la parada se produzca cuando una
determinada línea de entrada valga nivel “0” o, por ejemplo, que la ejecución se detenga
cuando el programa escriba el valor 0x33 en la posición 0x65 de la memoria RAM en cinco
ocasiones consecutivas y luego se lea el valor 0x18 de la posición 0x70.

 Memoria de trazado. Donde queda reflejado todo lo que ha ido ocurriendo en el curso de
la ejecución. Por ejemplo, podemos saber qué ha ocurrido durante la ejecución antes de
llegar a un breakpoint o punto de parada.

1-19
www.mkelectronica.com Microcontroladores PIC: Nivel I
 Analizador. El emulador dispone de señales de entrada que, a modo de analizador lógico.
La puedes conectar con los periféricos de tu proyecto para analizar las señales que
generan en función a los estímulos que reciben como consecuencia de la ejecución del
firmware.

 Grabador. El MPLAB-REAL ICE también realiza las tareas típicas de grabación del
controlador: leer, grabar, verificar, borrar, etc…

Todo esto y mucho más son las funciones que el emulador MPLAB-REAL ICE puede hacer por ti,
con el objetivo de poner a punto tu firmware o programa de aplicación. Lógicamente esto tiene un precio
más o menos elevado. A la hora de escribir estas líneas está por encima de los 350 €. Sin embargo, en las
ingenierías o centros de I+D donde el tiempo de diseño es importante, lo saben valorar y amortizar.

P-1.2.2 ICD-3

Procede del ICD-2 (In Circuit Debugger) y se trata del


depurador más utilizado por los usuarios de PIC. La
diferencia entre emulación y depuración es que en este caso
nuestro firmware se ejecuta sobre el propio microcontrolador
que está insertado en el hardware o tarjeta electrónica del
proyecto.

El ICD-3 se conecta, por un lado, con el PIC de nuestra


aplicación según las especificaciones ICSP de Microchip y,
por otro, con el PC a través de un puerto USB. ICSP se
corresponde con las iniciales In Circuit Serial Programming
(programación serie en circuito). Según esto, un PIC puede ser programado sin sacarlo de donde se
encuentra, empleando para ello 5 señales (ICSPDAT, ICSPCLK, MCLR, Vdd y GND), que se corresponden
con otras tantas patillas del microcontrolador.

Pues bien, el ICD-3 emplea esas mismas


señales para comunicarse con el PIC donde tiene lugar
la ejecución de nuestro firmware (target). Si a esto
añadimos que los PIC’s actuales integran mecanismos
de depuración en el propio chip, obtenemos una eficaz
herramienta de depuración. Todo ello se controla desde
un PC dotado del software de desarrollo MPLAB.

Está claro que no se pueden comparar las prestaciones del emulador MPLAB-REAL ICE con las del
depurador ICD-3, como tampoco se puede comparar el precio que, en el caso del ICD-3, es de menos de
200 €. y sirve prácticamente para la mayor parte de dispositivos PIC existentes a día de hoy. Con el
ICD-3 también podremos:

 Modificar y/o visualizar registros internos.


 Ejecución en tiempo real.
 Ejecución paso a paso.
 Ejecución por bloques.
 Emplear sencillos puntos de parada o breakpoints.

Incluso también se puede grabar el PIC con el firmware recién depurado. Es decir, tienes dos
herramientas en una: Depurado y Grabador. ¿Dónde está el “truco”? te preguntarás. Pues bien, no hay
truco. El emulador MPLAB-REAL ICE tiene más prestaciones y mecanismos de depuración que el ICD-3, y
este último posee además ciertas limitaciones que debes tener en cuenta:

 Para empezar, la comunicación entre el ICD-3 y el PIC donde se encuentra el firmware a depurar,
se realiza a través de las señales ICSP. Esto implica que esas señales o patillas del PIC están

1-20
www.mkelectronica.com Microcontroladores PIC: Nivel I
ocupadas. Durante la depuración/grabación no deben estar conectadas con periféricos de E/S
alguno.

 Anteriormente he comentado que los PIC’s actuales integran en su interior mecanismos propios de
depuración. Pues bien, estos mecanismos necesitan a su vez ser controlados. Lo primero que hace
el ICD-3 cuando se conecta con el PIC a depurar, es grabarle unas directivas o instrucciones para
realizar ese trabajo. Se consume por tanto un pequeño trozo del área de programa que nosotros no
podremos utilizar.

 Por la misma razón también se consumen algunas posiciones del área de memoria RAM que
nosotros tampoco podremos utilizar.

 Por idéntico motivo, se consumen al menos 2 niveles de la memoria de stack, aquella que sirve para
salvaguardar, en ocasiones, el valor actual del PC.

En fin, que no todo el monte es orégano. El empleo de herramientas como el ICD-3 o similares
implica aceptar una serie de restricciones y limitaciones. Sin embargo la experiencia nos dice que el ICD-3
es una herramienta más que interesante con una excelente relación calidad/precio.

P-1.2.3 PICkit 3

Se trata de otra herramienta original de Microchip, que


representa la versión económica del ICD-3 y es una evolución de
su predecesor, el PICKit-2. Por su reducido tamaño, peso y
precio, se convierte en una herramienta portátil, con posibilidades
de depuración y grabación. Es ideal para el trabajo de campo. Se
conecta con el PC mediante el puerto USB, y con tu tarjeta
electrónica de aplicación mediante las 5 señales ICSP típicas
disponibles en un conector de otros tantos pines: ICSPDAT,
ICSPCLK, MCLR, Vdd y GND

No llega a tener la flexibilidad del ICD-3 pero sí las


mismas limitaciones y restricciones. Dispone de todo lo
necesario para la depuración y puesta a punto de tu
aplicación:

 Visualización y modificación de registros internos.


 Ejecución en tiempo real.
 Ejecución paso a paso.
 Ejecución con un punto de parada o por bloques de programa.
 Capacidad de grabación del PIC.

Emplea para ello el entorno de desarrollo MPLAB-IDE del que hablaremos en breve, lo que le
convierte en una interesante herramienta de carácter didáctico, y a un precio más que asequible, en torno a
los 40€.

P-1.2.4 ICD-PIC

Se trata de la herramienta para depuración y


grabación desarrollada, fabricada y comercializada por MK
Electrónica (www.mkelectronica.com). De todas las
herramientas presentadas hasta el momento, es la más
sencilla y económica. Por un lado se conecta con el PC
mediante un puerto USB y, por otro, dispone de un
conector RJ11 que transporta las conocidas señales ICSP:

1-21
www.mkelectronica.com Microcontroladores PIC: Nivel I
ICSPDAT, ICSPCLK, MCLR, Vdd y GND. Este conector es compatible con el de otras herramientas de
Microchip y se conectará con la tarjeta electrónica de tu proyecto o Target.

En cuanto a las posibilidades de depuración y/o grabación, el ICD-PIC es bastante parecido al ICD-
3 y al PICKit-3, aunque no integra memoria de almacenamiento, no es tan versátil, ni la comunicación con el
PC tiene la misma fluidez. También tiene las mismas limitaciones y restricciones que tenían esos
depuradores y que no existían en el emulador MPLAB-REAL ICE. Concretamente el ICD-PIC está
desarrollado siguiendo las especificaciones de otra herramienta de Microchip, el PICkit-2, con la que es
compatible. Por este motivo, dado que es un clon de PICkit-2, ICD-PIC se puede controlar con el mismo
software de desarrollo MPLAB-IDE.

Otra restricción añadida, respecto a las anteriores herramientas, es que ICD-PIC únicamente
contempla la depuración y/o grabación de dispositivos PIC que se alimentan a +5 Vcc. No admite otro tipo
de tensiones de alimentación como puede ser la de 3.3 V que emplean algunos dispositivos.

Por mi parte, te puedo asegurar que es la herramienta que más utilizamos en MK Electrónica. No
sólo porque sea nuestra, que también, sino porque nos resulta muy pequeña, sencilla y manejable. La
usamos en los seminarios que impartimos tanto en empresas como en centros de enseñanza de diferente
tipo. También la empleamos en el diseño de los múltiples programas de ejemplos que publicamos y que
acompañan a gran cantidad de los productos que
comercializamos. Te puedo asegurar que, de los
cientos de programas que hemos realizado, la mayor
parte de ellos se han desarrollado y depurado usando
esta herramienta. Muy mal se nos tienen que poner
las cosas como para tener que hacer uso del peso
pesado de las herramientas descritas, el emulador
MPLAB-REAL ICE. Con esto quiero decir que,
aunque ICD-PIC es la más humilde y limitada, su
relación calidad/precio es excelente, en torno a los 40
€. Tú la vas a usar con los diferentes ejemplos que se
van a ir proponiendo en el curso.

En la figura puedes ver la herramienta ICD-


PIC haciendo tareas de depuración durante el diseño de un programa o firmware que controla el movimiento
del robot Azkar-Bot.

P-1.3 GRABADORES

Son herramientas que “SOLO” sirven para grabar tu programa o firmware una vez que estés seguro
de que funciona correctamente. Normalmente se conectan a un PC a través de un puerto serie o USB y van
acompañados del correspondiente software que lo controla.

Se supone que el firmware que vas a grabar en la memoria del controlador PIC lo has ensamblado o
compilado, y lo has depurado debidamente. Como consecuencia de ello, obtienes un fichero con el código
hexadecimal que hay que grabar. Normalmente este tipo de ficheros tienen la extensión *.HEX.

P-1.3.1 MPLAB-PM3

Es el más profesional (y caro) de los grabadores para controladores PIC. Original de Microchip es
capaz de grabar toda la gama de dispositivos existentes, incluidos los más recientes y modernos dsPIC y
PIC32. Puede trabajar con conexión al PC mediante un interface RS232 o USB. En este caso se controla
desde el ya renombrado entorno de trabajo MPLAB-IDE. También puede trabajar de forma autónoma. Se
lee el contenido de un PIC “original” que se almacena en una memoria interna del aparato. Luego haces las
copias que desees.

1-22
www.mkelectronica.com Microcontroladores PIC: Nivel I
Con los accesorios apropiados, que se compran
por separado, puede grabar todo tipo de encapsulados.
Además del clásico DIP, también puede trabajar con
encapsulados SOIC, SOT, TQFP, QFN, etc…

Se dice de él que es un grabador de producción.


Además de grabar el controlador también le somete a
una serie de test, condiciones de trabajo y diferentes
tensiones de alimentación. El resultado final es un PIC
grabado con absoluta garantía.

Sus altas prestaciones, al igual que su elevado


precio (en torno a los 650 €), hacen de él un aparato
empleado en grandes empresas y cadenas de montaje.

En el mercado también puedes encontrar grabadores de


otros fabricantes. Los llamados “Grabadores Universales” son
capaces de grabar memorias de diferentes tipos y capacidades así
como controladores y dispositivos programables de diferentes
modelos y fabricantes. En la figura tienes lo que se llama un
grabador “Gang”. Como puedes ver es capaz de grabar
simultáneamente varios dispositivos iguales.

P-1.3.2 PICSTART Plus

Es la solución económica que propone


Microchip. Se conecta con el PC a través de un puerto
serie y admite encapsulados de 40, 28, 18 y 8 patillas
pero sólo en formato DIP. Graba un gran número de
dispositivos, pero el proceso de grabación es lento ya
que no dispone de memoria RAM interna a modo de
buffer. Cada PIC a grabar exige una nueva transferencia
desde el PC del correspondiente fichero *.HEX.
Tampoco le somete a ningún tipo de test. Sin embargo
su precio es asequible, aproximadamente unos 150 €, y
su empleo muy aconsejable en fase de desarrollo de un
producto, en centros de enseñanza, investigación y
laboratorios.

Es un aparato muy veterano y no soporta todos los


dispositivos PIC más actuales como son algunos de las familias
DsPIC y PIC32.

P-1.3.3 USB-PIC’Burner

Este grabador es la propuesta de MK Electrónica


(www.mkelectronica.com). Se trata de un grabador de muy bajo
coste que se conecta y alimenta mediante un puerto USB del PC.
Dispone de un zócalo de inserción nula que admite dispositivos
de 8, 18, 28 y 40 patillas en encapsulado DIP. Está pensado para
trabajar con las familias PIC12, PIC16 y PIC18. Aún sin ser tan
versátil como el PICSTART Plus, y mucho menos que el MPLAB-

1-23
www.mkelectronica.com Microcontroladores PIC: Nivel I
PM3, sí permite grabar los dispositivos más representativos de la gran familia de microcontroladores PIC, a
un precio muy económico, unos 65 €. Una cualidad muy de agradecer en este grabador, es su
compatibilidad con otra herramienta de Microchip llamada PICKit-2 y con la plataforma de desarrollo
MPLAB-IDE de la que ya entraremos en detalle más adelante.

P-1.4 TARJETAS DE EVALUACIÓN

La mayor parte de fabricantes de microcontroladores, además de las herramientas descritas,


también fabrican lo que se llaman “tarjetas de evaluación”. Microchip no podía ser menos y, en menor
medida, MK Electrónica tampoco.

Por lo general estas tarjetas están pensadas para poder evaluar y probar todas las características
de una determinada familia de microcontroladores. Se evita así que el futuro usuario de ese dispositivo se
vea en la necesidad de montar ningún tipo de tarjeta electrónica y se centre, en exclusiva, en lo que es el
diseño del programa o firmware. Para ello, estas tarjetas disponen de una serie de periféricos conectados al
controlador y con los cuales puedes realizar todo tipo de experimentos que te permitirán descubrir todas las
posibilidades del controlador en cuestión: pantallas LCD, leds, pulsadores, sensores, etc.

P-1.4.1 PICDEM2 Plus

Es una de las múltiples tarjetas de evaluación


que comercializa Microchip. Fundamentalmente
está pensada para evaluar las características de
la mayor parte de dispositivos de la familia
PIC16F. Estos se insertan en el correspondiente
zócalo de 18, 28 o 40 patillas. Dispone de una
pantalla LCD, pulsadores para aplicar estímulos
de entrada, leds para reflejar estados de salida,
un zumbador, un sensor de temperatura, un
interface RS232, etc.

También dispone de un conector RJ11 compatible con las herramientas de depuración que te he
presentado anteriormente: MPLAB-REAL ICE, ICD-3 e ICD-PIC, y un área para el montaje de circuitos
electrónicos auxiliares. Su precio se aproxima a los 75 €.

P-1.4.2 USB-PIC’School

Se trata de un laboratorio desarrollado,


fabricado y comercializado por MK Electrónica. Se
diseñó a partir de un buen número de sugerencias
recibidas por profesionales, sobre todo, de la
enseñanza. Consiste en una plataforma de
experimentación flexible, potente y con una muy
buena relación calidad/precio de unos 180 €.
Orientada a todo tipo de usuarios, desde
profesionales de la industria y la enseñanza, hasta
estudiantes y aficionados en general. Es la
herramienta que te sugiero para realizar todas las
prácticas que se proponen en este curso.

Las características más relevantes del


laboratorio USB-PIC’School se pueden resumir a
continuación:

1-24
www.mkelectronica.com Microcontroladores PIC: Nivel I
 Interface con el PC mediante un puerto USB. Alimentación única mediante una fuente de
alimentación externa de 9 a 15 VDC (no incluida) con positivo al centro. El laboratorio
incorpora los circuitos de filtrado y estabilización así como interruptor e indicador de
ON/OFF.
 Admite dispositivos PIC de 8, 18, 28 y 40 patillas de las familias PIC12F, PIC16F y
PIC18F. De serie se suministra con el PIC16F886, dispositivo que hemos elegido para
realizar este curso y un buen representante de la numerosa familia PIC16.
 Oscilador de cristal de cuarzo integrado en encapsulado en formato DIP8, que proporciona
la frecuencia general de trabajo del sistema a 4 MHz. Este oscilador lo puedes cambiar
fácilmente por otros modelos con diferentes frecuencias.
 Integra un Depurador/Grabador que te permite depurar todas tus aplicaciones, así como
grabar finalmente el dispositivo. Este Depurador/Grabador es compatible con el PICKit-2
de Microchip y, por tanto, compatible con el software original MPLAB-IDE y PICKIT2.
 Tres modos diferentes de operación que se seleccionan mediante un sencillo conmutador
deslizante. El modo RUN lo usarás cuando el dispositivo está grabado con el firmware a
ejecutar. Todas las líneas de E/S quedan disponibles para el control de periféricos. El
modo USB lo empleas en las tareas de Depuración/Grabación de tu aplicación, tareas que
realizarás desde el entorno de desarrollo MPLAB-IDE. El modo ICSP te permite conectar
el laboratorio USB-PIC’School con otras herramientas externas dotadas de las señales
ICSP como pueden ser el MPLAB-REAL ICE o el ICD-3 de las que ya hemos hablado.
 Todos los puertos de E/S del PIC son accesibles mediante bloques de conectores que
permiten una rápida y sencilla conexión sin soldadura con los periféricos a controlar.
 Interface serie estándar RS232 con conector DB9 hembra y acceso para la gestión y uso
de las señales TxD, RxD, CTS y RTS en proyectos que impliquen comunicaciones serie.
 Reloj/Calendario en tiempo real (RTC) alimentado mediante pila y sensor de temperatura.
Ambos dispositivos se gestionan mediante los protocolos I2C y 1_Wire.
 Ocho entradas digitales mediante 4 interruptores y 4 pulsadores, y otras tantas salidas
digitales mediante leds.
 Dos displays de 7 segmentos y 0.5” de ánodo común multiplexados.
 Cuatro salidas digitales de alta corriente con tensión de salida de hasta 36 V/0.6 A cada
una. Ideal para que controles cargas como relés, motores DC, motores PAP, etc.
 Pantalla LCD de 2x16 caracteres con interface de 4 u 8 bits y teclado matricial de 4x4.
 Dos entradas analógicas mediante potenciómetros.
 Generador lógico de onda cuadrada con salida ajustable de 1 Hz, 10 Hz, 100 Hz y 1 KHz.
 Módulo board para el montaje sin soldadura de todo tipo de circuitos electrónicos.
 Conector de expansión PIC-BUS de 40 vías que transporta todas las señales del PIC y
permite la conexión de USB-PIC’School con todo tipo de tarjetas de expansión y/o de
aplicación.
 Va acompañado de un CDROM con manual del laboratorio en castellano, tutorial y una
colección de más de 70 ejemplos de aplicación y programación escritos en ensamblador y
en lenguaje C de alto nivel. Son los que vamos a seguir en este curso
 Se presenta totalmente montado, comprobado y listo para funcionar, en un maletín para
su transporte y/o almacenamiento. Se incluye el cable para la conexión USB con el PC.

P-1.4.3 PIC’Control

Más que de una tarjeta de evaluación, se trata de


una tarjeta de aplicación. Todos los sistemas de los que
hemos hablado en los anteriores apartados, tenían como
objetivo final facilitar el diseño y depuración del programa o
firmware de nuestro proyecto, desde su edición hasta las
pruebas finales y grabación en el PIC.

Llegados a este punto las tarjetas como la


PIC’Control mostrada en la figura, o similares, proporcionan
un sistema mínimo, pequeño y muy económico (unos 35 €)
listo para usar en el hardware final. La tarjeta únicamente
aloja al PIC recién grabado, su alimentación, el sistema
oscilador y poco más. Esta tarjeta se inserta luego en

1-25
www.mkelectronica.com Microcontroladores PIC: Nivel I
nuestro hardware que contiene a los periféricos que hay que
gobernar. Se puede considerar que es el último paso en un
proyecto. Obtener el equipo mínimo necesario para controlar la
aplicación.

Compatible con PIC’Control está disponible la tarjeta de


prototipos PIC’Project que se conecta directamente con ella.
Posee una zona de montaje donde puedes soldar los circuitos
electrónicos que
necesites.

Con ambas tarjetas puedes crear los prototipos iniciales de


un determinado proyecto antes de entrar en la fase de producción.

1-26
www.mkelectronica.com Microcontroladores PIC: Nivel I
UNIDAD 2: EL UNIVERSO PIC

OBJETIVOS

A partir de esta unidad vamos a ir centrándonos en el universo de los microcontroladores PIC


desarrollados por Microchip Technology Inc. Es el objetivo de este curso. Empezaremos haciendo un poco
de historia describiendo las familias en las que se agrupan los diferentes modelos de controladores PIC
existentes. Entre todas ellas vamos a destacar la familia PIC16F88X y, concretamente, a su miembro
PIC16F886. Es el que vamos a usar en las prácticas. Se trata de uno de los dispositivos más
representativos y completos de la numerosa familia PIC16FXXX. ¡¡ Alguno había que elegir !!

En el área de prácticas nos vamos a centrar en el entorno de desarrollo MPLAB-IDE. Tendremos


una primera toma de contacto con esta fabulosa herramienta software desarrollada por Microhip y
suministrada de forma gratuita. Usarás el MPLAB-IDE para escribir tu programa de aplicación, también
llamado “programa fuente”. Lo vas a escribir usando el lenguaje ensamblador incluido en el propio MPLAB-
IDE. Si dispusieras de los compiladores adecuados, también podrías escribir tus programas en lenguajes de
alto nivel como el lenguaje C. Con el MPLAB-IDE podrás ensamblar o compilar tus programas fuente.

El MPLAB-IDE dispone de las herramientas necesarias para que pongas a punto tus programas,
bien mediante simulación, o bien mediante emulación y/o depuración. También podrás grabar la memoria
del controlador. Todo ello dependerá de las herramientas hardware que dispongas. En este curso haremos
simulación, depuración y grabación. Para ello, todos los ejemplos propuestos, se estudiarán y probarán
sobre el laboratorio USB-PIC’School. Está equipado con una herramienta hardware compatible con el
PICkit-2, lo que te permitirá hacer depuración en tiempo real y grabación del PIC.

ÁREA DE TEORÍA

T-2.1 Los microcontroladores PIC


T-2.1.1 Repasando un poco la historia
T-2.1.2 Las familias de microcontroladores PIC
T-2.1.3 La subfamilia PIC16F88X

T-2.2 El PIC16F886
T-2.2.1 Descripción del patillaje
T-2.2.1.1 Patillas de alimentación
T-2.2.1.2 El Puerto A
T-2.2.1.3 El Puerto B
T-2.2.1.4 El Puerto C
T-2.2.1.5 El Puerto D

T-2.2.2 Arquitectura interna


T-2.2.2.1 Análisis del núcleo
T-2.2.2.2 Accesorios
T-2.2.2.3 Los circuitos de interface

T-2.2.3 El área de la memoria RAM de datos


T-2.2.4 Los más especiales de los registros SFR
T-2.2.4.1 El registro de estado STATUS
T-2.2.4.2 El registro de opciones OPTION_REG

T-2.2.5 El área de memoria FLASH de programa

2-1
www.mkelectronica.com Microcontroladores PIC: Nivel I
ÁREA DE PRÁCTICAS

P-2.1 El software MPLAB-IDE


P-2.1.1 Instalación de MPLAB-IDE
P-2.2.2 Opción Configure
P-2.2.3 Opción File
P-2.2.4 Opción Edit
P-2.2.5 Opción View
P-2.2.6 Opción Project
P-2.2.7 Opción Debugger
P-2.2.8 Opción Programmer
P-2.2.9 Opción Tools
P-2.2.10 Opción Window
P-2.2.11 Opción Help

MATERIAL COMPLEMENTARIO

 Software MPLAB-IDE V 8.92


 MPLAB-IDE User’s guide
 Guía rápida de referencias
o Registros especiales (SFR)
o Los más especiales de los registros especiales: STATUS y OPTION_REG
 Videos
o Circuitos complementarios
o Introducción al MPLAB
 Cuestionario

2-2
www.mkelectronica.com Microcontroladores PIC: Nivel I
AREA DE TEORÍA

T-2.1 LOS MICROCONTROLADORES PIC

Por fin vamos nos vamos encaminando hacia el objetivo final de este curso on-line, que no es otro
que estudiar el fabuloso mundo de los micrcontroladores PIC, para poderlos usar en todos nuestros futuros
proyectos y aplicaciones.

T-2.1.1 Repasando un poco la historia

Microchip Technology Inc surge de una escisión de la división de


semiconductores de la empresa General Instruments, allá por el año
1989. General Instruments es una empresa dedicada a la fabricación
de diferentes tipos de componentes electrónicos entre los que se
encontraban unos controladores de entradas/salidas de alta corriente y programables. A estos dispositivos
se les denominó abreviadamente PIC (Peripheral Interface Controllers).

Consistían en unos controladores basados en arquitectura Harvard y con un reducido juego de


instrucciones (RISC). Eran capaces de ejecutar una instrucción por cada ciclo y podían trabajar a una
velocidad de hasta 20 MHz. Se trataban pues de unos microcontroladores muy eficientes respecto a los
clásicos microcontroladores de 8 bits de la época. Además, tenían una ventaja adicional. Cada línea de
entrada/salida podía ofrecer una corriente de salida de 25 mA, mientras que sus competidores sólo ofrecían
una corriente en torno a los 2 mA.

Por razones de tipo comercial, General Instruments decide vender su división de semiconductores,
junto con la factoría de Chandler, Arizona, a un grupo de inversionistas. Este grupo se hace llamar Microchip
Technology Inc y su producto principal en aquel entonces son los microcontroladores PIC.

En 1992 la línea de microcontroladores PIC que ofrece Microchip consta de 6 dispositivos


diferentes, con características bastantes limitadas, y un sistema poco convencional de bancos de memoria:

 La gama baja con núcleos que aceptan instrucciones de 12


bits, disponía de cuatro dispositivos diferentes (PIC16C5X) y de
18 a 28 patillas.
 La gama media con núcleos que aceptan instrucciones de 14
bits. Por esas fechas dispone de un único dispositivo, el
PIC16C71, que incluye un convertidor ADC y capacidad de
manejar interrupciones.
 La gama alta con núcleos que aceptan instrucciones de 16 bits
y compuesta, en aquel entonces, de un único dispositivo, el
PIC17C42.

Por esas fechas comienza también la producción de las


primeras herramientas de desarrollo como el emulador en tiempo real
PICMASTER, el programador PicPRO II y los compiladores de
lenguaje C de alto nivel. Los dispositivos están compuestos de
memoria de programa del tipo PROM, que permite su grabación una
única vez (OTP) y, también con memoria EPROM que, a un precio
mayor, posibilitaban su reutilización.

En su constante evolución a lo largo del tiempo, se va desarrollando e implementando la memoria


EEPROM y las técnicas de grabación serie en circuito (In Circuit Serial Programming = ICSP).

2-3
www.mkelectronica.com Microcontroladores PIC: Nivel I
Un dispositivo de la época que se convirtió en toda una
referencia, fue el venerado PIC16C84. Con él han aprendido la
mayor parte de los diseñadores que, hoy en día, desarrollan
productos basados en controladores PIC. Me incluyo entre ellos.
La mayor novedad es que, al incluir una memoria de programa del
tipo EEPROM junto con la tecnología ICSP, podía ser
reprogramado sin tener que moverlo del circuito en el que
estuviera insertado. Este detalle fue muy valorado por todos los
usuarios y en todos los ámbitos. Posteriormente la memoria de
programa pasó a ser del tipo FLASH y de ahí surgió su homólogo,
el PIC16F84. ¿Has oído hablar de él?

Poco después aparecen los potentes dispositivos


PIC16F87X. Tienen la misma arquitectura interna que el PIC16F84, pero integran una mayor cantidad de
memoria FLASH de programa, de memoria RAM de datos y, sobre todo, integran un gran número de
circuitos para la conexión de periféricos. De aquí surge la actual y mejorada familia PIC16F88X objeto de
este curso.

En el año 2000 se introduce la familia PIC18. Consta de


dispositivos con núcleos de instrucciones de 16 bits que
sustituyen a sus predecesores de la familia PIC17 ya
descatalogada. Esta familia cumple con dos requisitos cada vez
más demandados: mayor cantidad de memoria y mayor velocidad
de ejecución.

No queda aquí todo. En constante lucha con la


competencia, Microchip desarrolla y comercializa las familias
DsPIC y PIC24 con núcleos de 16 bits de datos e instrucciones de
24 bits. También desarrolla la familia PIC32 de 32 bits. Se tratan
de dispositivos de altas prestaciones a un coste muy asequible.

A día de hoy es posible que Microchip sea el número uno en ventas de microcontroladores de 8 bits
de la familia PIC16. También se puede decir que todas sus familias siguen en pleno desarrollo e
incorporando nuevos miembros. Cabe destacar que en todas ellas se han ido sustituyendo poco a poco los
diferentes tipos de memoria de programa por la memoria de tipo Flash más flexible y rápida.

Por último, aunque sólo sea por comentarlo, indicar que Microchip Technology Inc desarrolla otro
tipo de dispositivos electrónicos como son memorias, operacionales, sistemas RFID, analógicos, y un largo
etc. Aquel grupo inicial de inversores ha ido creciendo y adquiriendo otras empresas con sus
correspondientes tecnologías. Visitar su página web puede darte una idea de todos los productos que
desarrolla: www.microchip.com

T-2.1.2 Las familias de microcontroladores PIC

Una de las garantías que ofrece Microchip


respecto a sus microcontroladores, es el
constante desarrollo de nuevos productos,
manteniendo los antiguos o, al menos, siendo
compatibles con ellos. Hoy podemos hablar de
decenas de dispositivos PIC que se agrupan en
diferentes gamas y familias. Todas ellas están en
constante evolución y recibiendo nuevos
miembros. La siguiente figura obtenida de fuentes
originales de Microchip expresa un poco la
evolución y familias disponibles.

2-4
www.mkelectronica.com Microcontroladores PIC: Nivel I
Vamos a hacer un pequeño resumen de las mismas.

 La gama baja. Es quizá la más veterana pero constantemente actualizada. Los


microcontroladores integran un núcleo o CPU de 8 bits de datos que maneja instrucciones
codificadas en 12 bits. A su vez se divide en dos subfamilias. La PIC10FXXX está
compuesta por los dispositivos más pequeños y
económicos del mercado. Imagínate un chip de tan
solo 6 patillas, 4 de las cuales actúan como líneas de
E/S. Quizá no te parezca gran cosa, pero piensa en
la gran cantidad de sencillas aplicaciones que se
pueden automatizar con un chip que cuesta unos
pocos céntimos de euro, en lugar de emplear
circuitos convencionales para hacer lo mismo. Luego
está la subfamilia PIC12FXXX un poquito más
grande que la anterior. Con sus 8 patillas, 6 de las
cuales pueden ser E/S, integran también
convertidores ADC y módulos de comunicación serie.
Un miembro muy representativo de esta familia es el
popular PIC12F508.

 La gama media. Bajo mi punto de vista es la más desarrollada. Está formada por la
familia PIC16FXXX y probablemente supere el
centenar de miembros. Integra un núcleo de 8 bits y
utiliza instrucciones codificadas en 14 bits. Al margen
de las características del núcleo, podemos decir que
en esta familia existen miembros que destacan por el
gran número de circuitos de interface distintos que
disponen, y que son similares a los que integran los
dispositivos de familias o gamas superiores.
Hablamos no sólo de controlar simples líneas de E/S,
también hablamos de convertidores ADC, DAC,
Timers, Comparadores, Modulación PWM, USART,
Comunicación I2C y SPI, etc… Además podemos
encontrar dispositivos con más o menos memoria
Flash de programa y más o menos memoria RAM de
datos, para ajustarse a nuestras necesidades.

 La gama alta. Está formada por la familia PIC18FXXXX y sustituye a la familia PIC17. Su
núcleo es de 8 bits de datos y gestiona instrucciones de 16 bits. En esta familia Microchip
consiguió mejorar notablemente la velocidad de trabajo, aumentar la memoria disponible
tanto de programa como de datos y mejorar la gestión
de la misma. Desaparece el concepto de bancos de
memoria que se emplea en las familias anteriores. En
cuanto a los periféricos, se puede decir que son
prácticamente los mismos que integran los miembros
más potentes de la familia PIC16FXXX, pero quizá
mejorando las prestaciones de alguno de ellos.

 La familia DsPICXXFXXXX. Fueron los primeros microcontroladores de Microchip con


funciones propias para el proceso digital de señales. El núcleo es capaz de manejar datos
de 16 bits y las instrucciones, codificadas en 24 bits, permiten el cálculo matemático de
una forma rápida y eficaz. Integran prácticamente los
mismos periféricos que los miembros más potentes de
la gama media, pero en mayor cantidad: mayor
número de USARTs, de salidas PWM, etc.

 La familia PIC24XXXXX. Es similar a la familia DsPIC


pero no integran funciones propias para el
procesamiento digital de señal. Los periféricos son
similares, pero tienen la posibilidad de ser reubicados
según las necesidades del diseño. Esto quiere decir
que por ejemplo, un USART cuyas líneas se

2-5
www.mkelectronica.com Microcontroladores PIC: Nivel I
corresponden con determinadas patillas, puede ser configurada y sus señales reubicadas
en otras patillas distintas.

 La familia PIC32FXXXX. Es el último desarrollo


que propone Microchip en cuanto a los
microcontroladores que produce. Sus miembros
disponen de una CPU o núcleo capaz de
gestionar datos de 32 bits. Esto, junto a la gran
cantidad de memoria de programa y de datos que
integran, hace que estos dispositivos estén
orientados a aplicaciones que requieran
manipular un gran volumen de datos con una
gran velocidad de proceso.

T-2.1.3 La subfamilia PIC16F88X

Varios son los motivos que me llevan a elegir uno de estos dispositivos de la gama media:

1. Forzosamente necesitamos de un dispositivo que nos sirva de referencia para poder


explicar tanto los conceptos teóricos como, sobre todo, los diferentes ejemplos prácticos
que iré proponiendo.

2. El dispositivo en cuestión está lo suficientemente actualizado en el momento de preparar


éste curso. Estos dispositivos sustituyen y superan a los veteranos miembros PIC16F87X.

3. Son lo suficientemente versátiles y potentes como para poder tener la seguridad de que el
esfuerzo ha merecido la pena. Los dispositivos PIC16F88X poseen la mayor parte de las
prestaciones que otros dispositivos de la misma gama y también de gamas superiores. No
nos costará mucho migrar a otro tipo de microcontrolador.

4. Disponemos de todas las herramientas hardware y software necesarias, como para poder
acometer nuestros proyectos de forma inmediata.

Son cinco los dispositivos de la subfamilia PIC16F88X de la gama media, cuyas características
principales se resumen en la siguiente tabla:

Memoria Memoria Timers


de de Compa- de 8/16
Dispositivo programa datos E/S A/D CCP USART MSSP radores bits
FLASH RAM EEPROM
PIC16F882 2048 128 128 24 11 1/1 1 1 2 2/1
PI PIC16F883 4096 256 256 24 11 1/1 1 1 2 2/1
PIC16F884 4096 256 256 35 14 1/1 1 1 2 2/1
PIC16F886 8192 368 256 24 11 1/1 1 1 2 2/1
PIC16F887 8192 368 256 35 14 1/1 1 1 2 2/1

De estos 5 dispositivos elegimos el PIC16F886. Es muy fácil de conseguir y su relación


prestaciones/precio es muy buena. A continuación se detallan las características más relevantes de este
microcontrolador. Quizá algunas de estas características no te digan nada de momento, pero ya las irás
viendo a lo largo del curso.

Características del núcleo o CPU

 Arquitectura Harvard con un juego reducido de 35 instrucciones (RISC). Todas las


instrucciones, excepto las de salto, se ejecutan en un único ciclo.
 Velocidad de trabajo de hasta 20 MHz. Una instrucción se ejecuta en un único ciclo de 200
nS.
 Capacidad de interrupción.
 Memoria stack por hardware de 8 niveles.
 Direccionamientos directo, inmediato, indirecto y relativo.

2-6
www.mkelectronica.com Microcontroladores PIC: Nivel I
Características especiales

 Oscilador interno de precisión calibrado en fábrica y una tolerancia de +/- 1%. Se puede
seleccionar la frecuencia principal de trabajo entre 32 KHz y 8 MHz.
 Modo sleep (standby) de bajo consumo.
 Rango de alimentación desde 2.0 V hasta 5.5 V
 Rango de temperatura industrial.
 Reset automático con la alimentación (Power On Reset)
 Temporización tras la alimentación (PWRT) y para la estabilización del oscilador (OST)
 Detección y Reset por fallo de alimentación (BOR).
 Supervisor o watch dog (WDT) configurable por software
 Múltiples opciones de Reset
 Protección de código
 Memoria Flash/EEPROM de larga duración. La memoria Flash de programa admite
100.000 ciclos de grabación y la EEPROM de datos 1.000.000. En ambos casos se
garantiza una retención de datos mayor de 40 años.
 Capacidad de depuración en circuito.

Características de bajo consumo

 Consumo en reposo o standby de sólo 50 nA con una alimentación de 2.0 V


 Consumo en ejecución de 11 µA trabajando a 32 KHz y 2.0 V o de 220 µA a 4 MHz con
2.0 V de alimentación.
 Consumo del temporizador del supervisor (Watch Dog) de 1 µA a 2.0 V

Características de los periféricos

 24 líneas de E/S totalmente independientes y configurables. Soportan corrientes de hasta


25 mA, algunas tienen capacidad de interrupción y se les puede asociar a resistencias
pull-up internas.
 Dos módulos comparadores de tensiones analógicas con tensión de referencia fija o
programable, entradas y salidas accesibles desde las patillas, modo latch SR y capacidad
de disparo de un temporizador.
 Convertidor A/D con 11 canales de entrada y una resolución de 10 bits.
 Timer 0. Temporizador/contador de 8 bits con preescaler programable.
 Timer 1. Temporizador/contador de 16 bits con preescaler, control externo de disparo y
oscilador de bajo consumo de 32 KHz.
 Timer 2. Temporizador de 8 bits con registro de periodos, preescaler y postcaler.
 Dos módulos CCP de 16 bits para la captura, comparación y modulación PWM.
Resolución de 12.5 nS en la captura, 200 nS en la comparación y una frecuencia de 20
KHz en el modo PWM.
 Módulo USAR para comunicaciones serie. Soporta RS-232, RS-485 y LIN 2.0. Dispone de
auto detección de baudios.
 Módulo de comunicaciones síncronas MSSP que soporta comunicación SPI e I2C tanto en
el modo máster como slave.

T-2.2 EL PIC16F886

¡Por fin! Hemos llegado a nuestro microcontrolador. Alguno hay que elegir para centrar, sobre todo,
el aspecto práctico de este curso. A pesar de ello, no debes olvidar que TODO lo que aprendas sobre este
modelo en concreto, lo puedes aplicar a todos los miembros de la gama media PIC16FXXX en general y del
subfamilia PIC16F88X en particular. Incluso la mayor parte de los conocimientos que adquieras, serán
válidos para aplicarlos tanto en la gama baja PIC12FXXX como en la gama alta PIC18FXXXX. Hay que
decir también que con este curso en ningún caso se pretende sustituir a la documentación técnica que
ofrece el fabricante y que te aconsejo tener siempre a mano. El objetivo es introducirte en el mundo de los
controladores PIC de la forma más sencilla, ordenada y asequible posible.

2-7
www.mkelectronica.com Microcontroladores PIC: Nivel I
Haciendo un muy breve resumen de los conceptos que has visto hasta ahora, puedes ver que
algunos de ellos se encuadran dentro de este modelo:

 Microcontrolador que integra en un único chip la CPU o núcleo, la memoria de programa, la


memoria de datos y los circuitos para el interface con los periféricos de E/S.
 Memoria de programa del tipo Flash reutilizable.
 Memoria de datos del tipo RAM para las variables y del tipo EEPROM para los datos constantes
pero modificables.
 Arquitectura Harvard.
 Las instrucciones y sus parámetros u operandos se codifican en una única palabra de 14 bits.
 Todas las instrucciones, excepto los saltos que emplean dos, se buscan y ejecutan en un único
ciclo. Se solapa la fase de búsqueda de una instrucción con la ejecución de la instrucción previa.
 Juego reducido de instrucciones (RISC).

T-2.2.1 Descripción del patillaje

Debes tener en cuenta que un controlador, en el fondo, es un circuito integrado con más o menos
patillas. A través de ellas le vas a conectar la tensión de alimentación y los
periféricos que necesitas en tu proyecto o aplicación. El programa que grabes
en su interior se encargará de su control.

Como te muestra la figura, puedes encontrarte con un mismo modelo


PIC, con diferentes tipos de encapsulados: PDIP, SOIC, SSOP, TQFP, etc…
Si consultas los datos del fabricante, los “Data Sheet”, puedes obtener las
medidas reales de cada uno de ellos. Eliges el que más te convenga para tu
diseño basándote en el tamaño que ocupa y el precio.

Para que te hagas una idea. El PIC16F886 con el que vas a


trabajar tiene 24 patillas y lo puedes encontrar en encapsulados PDIP,
SOIC, SSOP y QFN. En la siguiente figura puedes comprobar la relación de
tamaño que hay entre los encapsulados PDIP, QFN y SOIC. Impresionante
¿no?

A nivel didáctico es mucho más práctico el empleo del encapsulado PDIP. Es el que más espacio
ocupa y puede que sea incluso el más caro. Sin embargo, lo puedes encontrar fácilmente en el mercado y lo
puedes comprar por unidades. Además, es mucho más manejable. Por otra parte por qué no decirlo,
teniendo en cuenta que estás aprendiendo, es más que probable que, debido a una mala conexión,
estropees más de un dispositivo. Hay que asumirlo y este tipo de encapsulado es el más fácil de
intercambiar.

En la siguiente figura tienes la distribución y nombre de las señales del microcontrolador en un


encapsulado del tipo PDIP.
Quizá el nombre de las
mismas te pueda resultar
engorroso y difícil de
recordar, pero en mi opinión
es mejor emplearlas tal
cual. Ya te acostumbrarás y
además piensa que, ese
mismo nombre, es el que te
vas a encontrar en la
abundante información
técnica, notas de aplicación
y ejemplos existentes.

2-8
www.mkelectronica.com Microcontroladores PIC: Nivel I
Por desgracia, para que puedas aprovechar
todos los recursos que te ofrece el controlador
PIC16F886, debes aprenderte la función de cada una
de sus 28 patillas o pines. Ten en cuenta que al fin y al
cabo son las que tienes que conectar con los periféricos
que vas a gobernar en tu proyecto.

Además, para complicar un poco más las


cosas, debes saber que la mayor parte de esas patillas
tienen una doble, triple e incluso cuádruple función.
Todo depende del uso que quieras darlas y de cómo las
configures en tu programa.

En fin, es lo que hay, pero no te desanimes. Tampoco es necesario que te las aprendas de memoria
aquí y ahora. Lo importante es que te sepas desenvolver y que busques la información apropiada según la
vayas necesitando. Con el tiempo te irás familiarizando. Además, en este curso de introducción a los PIC
vas a emplear esas patillas en sus formas más simples, como entradas y salidas digitales. Son comunes a
todos los controladores y voy a tratar de describirlas en un orden lógico.

T-2.2.1.1 Patillas de alimentación

Estamos hablando de un circuito electrónico, de un microcontrolador, y como tal tienes que


alimentarlo por las patillas correspondientes. El modelo PIC16F886 admite tensiones de 2 a 5.5 V.

PIN NOMBRE FUNCION DESCRIPCIÓN


8 VSS VSS Tierra de alimentación
19 VSS VSS Tierra de alimentación
20 VDD VDD Positivo de alimentación

T-2.2.1.2 El Puerto A

Está compuesto por 8 patillas. La mayor parte de ellas tienen múltiples funciones, pero de momento
las vas a usar en su forma más sencilla: como simples líneas de entrada o salida digitales (E/S). Te las he
resaltado. El resto de funciones no las vas a usar, al menos de momento. Simplemente acostúmbrate a
ellas.

PIN NOMBRE FUNCION DESCRIPCIÓN


2 RA0 E/S digital de propósito general
RA0/AN0/ULPWU/C12IN0- AN0 Entrada 0 del convertidor analógico digital
ULPWU Entrada de interrupción por cambio de estado y muy bajo consumo
C12IN0- Entrada invertida 0 para los comparadores analógicos C1 o C2
3 RA1 E/S digital de propósito general
RA1/AN1/C12IN1- AN1 Entrada 1 del convertidor analógico digital
C12IN1- Entrada invertida 1 para los comparadores analógicos C1 y C2
4 RA2 E/S digital de propósito general
RA2/AN2/VREF-/CVREF AN2 Entrada 2 del convertidor analógico digital
/C2IN+ VREF- Entrada de tensión de referencia negativa para el convertidor A/D
CVREF Salida de tensión de referencia del comparador
C2IN+ Entrada no invertida del comparador C2
5 RA3 E/S digital de propósito general
RA3/AN3/VREF+/C1IN+ AN3 Entrada 3 del convertidor analógico digital
VREF+ Entrada de tensión de referencia positiva para el convertidor A/D
C1IN+ Entrada no invertida del comparador C1
6 RA4 E/S digital de propósito general
RA4/T0CKI/C1OUT T0CKI Entrada de reloj externo para el temporizador Timer 0
C1OUT Salida del comparador C1
7 RA5 E/S digital de propósito general
RA5/AN4/SS/C2OUT AN4 Entrada 4 del convertidor analógico digital
SS Entrada de selección de dispositivo SPI en modo esclavo
C2OUT Salida del comparador C2

2-9
www.mkelectronica.com Microcontroladores PIC: Nivel I
10 RA6 E/S digital de propósito general
RA6/OSC2/CLKOUT OSC2 Salida de conexión para el cristal de cuarzo o resonador externo
CLKOUT Salida de la señal de reloj del sistema (FOSC/4)
9 RA7 E/S digital de propósito general
RA7/OSC1/CLKIN OSC1 Entrada de conexión para el cristal de cuarzo o resonador externo
CLKIN Entrada reloj externo para el sistema u oscilador RC

De forma simplificada puedes considerar al Puerto B, y también al resto de Puertos, como un


conjunto de patillas a las que puedes conectar tus periféricos digitales de entrada o salida. Observa la
figura.

T-2.2.1.3 El Puerto B

Está compuesto por otras 8 patillas. La mayor parte de ellas también tienen múltiples funciones,
pero de momento las vas a usar en su forma más sencilla: como simples líneas de entrada o salida digitales
(E/S).

PIN NOMBRE FUNCION DESCRIPCIÓN


21 RB0/AN12/INT RB0 E/S digital de propósito general
AN12 Entrada 12 del convertidor analógico digital
INT Entrada de interrupción externa
22 RB1/AN10/P1C RB1 E/S digital de propósito general
AN10 Entrada 10 del convertidor analógico digital
P1C Salida C de señal PWM
23 RB2/AN8/P1B RB2 E/S digital de propósito general
AN8 Entrada 8 del convertidor analógico digital
P1B Salida B de señal PWM
24 RB3/AN9/PGM/C12IN2- RB3 E/S digital de propósito general
AN9 Entrada 9 del convertidor analógico digital
PGM Habilitación para la grabación ICSP con baja tensión
C12IN2- Entrada invertida 2 para los comparadores analógicos C1 y C2
25 RB4/AN11/P1D RB4 E/S digital de propósito general
AN11 Entrada 11 del convertidor analógico digital
P1D Salida D de señal PWM
26 RB5/AN13/T1G RB5 E/S digital de propósito general
AN13 Entrada 13 del convertidor analógico digital
T1G Entrada de disparo para el temporizador Timer 1
27 RB6/ICSPCLK RB6 E/S digital de propósito general
ICSPCLK Entrada de reloj durante la grabación ICSP
28 RB7/ICSPDAT RB7 E/S digital de propósito general
ICSPDAT Entrada/salida de datos durante la grabación ICSP

De igual manera, puedes considerar a la Puerta B como un conjunto de 8 patillas donde puedes
conectar cualquier periférico digital de entrada o salida.

2-10
www.mkelectronica.com Microcontroladores PIC: Nivel I
T-2.2.1.4 El Puerto C

También está compuesto por 8 patillas. Se le suele llamar “Puerto de comunicaciones” dado que
algunas de ellas se emplean para comunicar el controlador con otros dispositivos externos. En cualquier
caso, de momento las vas a usar en su forma más sencilla: como entradas y salidas para el control de
periféricos digitales.

PIN NOMBRE FUNCION DESCRIPCIÓN


11 RC0/T1OSO/T1CKI RC0 E/S digital de propósito general
T1OSO Salida del oscilador para el temporizador Timer 1
T1CKI Entrada de reloj externo para el temporizador Timer 1
12 RC1/T1OSI/CCP2 RC1 E/S digital de propósito general
T1OSI Salida del oscilador externo para el temporizador Timer 1
CCP2 Entrada o salida desde el módulo CCP2
13 RC2/P1A/CCP1 RC2 E/S digital de propósito general
P1A Salida A de señal PWM
CCP1 Entrada o salida desde el módulo CCP1
14 RC3/SCK/SCL RC3 E/S digital de propósito general
SCK Señal de reloj para el bus SPI
SCL Señal de reloj para el bus I2C
15 RC4/SDI/SDA RC4 E/S digital de propósito general
SDI Entrada de datos serie para el bus SPI
SDA Entrada o salida de datos serie para el bus I2C
16 RC5/SDO RC5 E/S digital de propósito general
SDO Salida de datos serie para el bus SPI
17 RC6/TX/CK RC6 E/S digital de propósito general
TX Transmisión de datos desde el USART en modo asíncrono
CK Señal de reloj para el USART en comunicaciones síncronas
18 RC7/RX/DT RC7 E/S digital de propósito general
RX Recepción de datos en el USART en modo asíncrono
DT Línea de datos del USAR en comunicaciones síncronas

Al igual que con los dos Puertos anteriores, al Puerto C también lo debes considerar como un puerto
con 8 patillas donde puedes conectar tus periféricos digitales de entrada o salida.

T-2.2.1.5 El Puerto E

En el modelo PIC16F886 es el puerto más sencillo. Está compuesto de una única patilla que
además, en caso de que la conectes a un periférico, sólo puede configurarse como entrada digital.

PIN NOMBRE FUNCION DESCRIPCIÓN


1 RE3/MCLR/Vpp RE3 Entrada digital de propósito general
MCLR Entrada de RESET con resistencia pull-up interna
Vpp Entrada de tensión durante los ciclos de grabación

En otros modelos, por ejemplo en el modelo PIC16F887, el Puerto E


consta de 4 patillas. No es el caso de nuestro PIC16F886. Este sólo tiene
una patilla, la 1, y sólo puede ser entrada.

2-11
www.mkelectronica.com Microcontroladores PIC: Nivel I
T-2.2.2 Arquitectura interna

En la figura de la siguiente página tienes el esquema “por bloques” con la arquitectura interna del
microcontrolador PIC16F886. Es simplemente para que te hagas una idea. Recuerda que todo está
integrado en un único chip. En el esquema se diferencia lo que es el núcleo, común a todos los dispositivos
de la familia PIC16F, de lo que son los circuitos de interface. Algunos de estos circuitos también son
comunes en aquellos controladores que los integren, aunque sean de diferentes familias.

Respecto a las áreas de memoria se distinguen claramente la de programa y la de datos. La primera


está formada por memoria del tipo Flash con una capacidad de 8 K que permite albergar hasta 8.192
instrucciones de programa con 14 bits por instrucción (1K=1024). El área de datos está formada por
memoria del tipo RAM con capacidad de almacenar hasta 368 bytes de 8 bits para datos variables. Dispone
también de una memoria EEPROM, abajo a la derecha, que se gestiona exclusivamente mediante
programa. Tiene capacidad para almacenar 256 datos de 8 bits cada uno y en ella puedes guardar
información constante aunque modificable.

T-2.2.2.1 Análisis del núcleo

Observa la sección correspondiente al núcleo o CPU. Vamos a tratar de hacer una breve
descripción de él y de sus componentes más importantes. Muchos de estos componentes los irás
estudiando y manejando en las siguientes unidades, pero hacer ahora un pequeño repaso de los mismos, te
permitirá ir cogiendo una visión más global de todo el conjunto. Por otra parte, hay que insistir que este
núcleo es común a TODOS los miembros de la familia PIC16FXXX y muy parecido al de los miembros de
las familias PIC12FXXX y PIC18FXXXX. Creo que te merece la pena el esfuerzo.

Generador de tiempos

Se encarga de generar la señal de reloj principal del sistema.


Marca las pautas de tiempo con las que se sincronizan todos
los elementos internos del microcontrolador. Basta con
conectar un sencillo cristal o un circuito resonador de cuarzo
entre las patillas RA7/OSC1/CLKIN y RA6/OSC2/CLKOUT
para generar la frecuencia de trabajo.

Oscilador interno

El PIC16F886 dispone de un oscilador interno capaz de generar la


frecuencia principal del sistema en un rango seleccionable que va desde los
32 KHz hasta los 8 MHz. Puedes evitar usar un cristal de cuarzo externo y
así, las patillas donde hubiera que haberlo conectado, las empleas ahora
como patillas de E/S.

Contador de Programa (PC)

Se emplea para seleccionar las posiciones de la


memoria Flash de programa. Inicialmente parte
de 0 y se va incrementando secuencialmente
para apuntar en todo momento a la siguiente
instrucción que toca ejecutar. Consta de 13 bits,
lo que le permiten seleccionar cualquiera de las
8.192 posiciones de que consta la memoria Flash
13
de programa (2 ). Asociado al PC se encuentra
lo que se llama la memoria de “stack”. Dispone
de 8 niveles o registros y se emplea
ocasionalmente para salvaguardar y recuperar el valor actual del PC.

2-12
www.mkelectronica.com Microcontroladores PIC: Nivel I
Arquitectura interna del PIC16F886

2-13
www.mkelectronica.com Microcontroladores PIC: Nivel I
Registro de instrucciones

Se encarga de recibir y retener en el bus de instrucciones el código de la instrucción


que hay que ejecutar. Todas las instrucciones están compuestas de 14 bits y
proceden de la memoria Flash de programa, concretamente de la dirección que en
ese momento esté indicando el PC.

Decodificador de instrucciones

Recibe el código de la instrucción, lo decodifica y actúa sobre todos los elementos


que estén involucrados en la ejecución de esa instrucción.

ALU (Unidad Aritmético Lógica)

Se encarga de ejecutar todas las operaciones aritméticas y lógicas (suma,


resta, AND, OR, etc.), según le indique el decodificador de instrucciones
que recibió el código de la instrucción a ejecutar. La ALU recibe dos
operandos o datos. Uno de ellos se encuentra siempre en el registro
llamado W, al que previamente habrás cargado con el valor deseado. El
otro puede proceder de la propia instrucción que se va a ejecutar o, a través
del bus de datos, de una posición de la memoria RAM de datos o de un
determinado periférico. El resultado se puede depositar en el registro W o
en la misma posición RAM que se utilizó como operando.

Registro W

También llamado “Work register” participa prácticamente en todas las operaciones aritmético/lógicas que
ejecuta la ALU. Contiene uno de los datos y puede recibir también el resultado.

STATUS

Refleja el estado en que queda el núcleo o CPU tras haber ejecutado una
instrucción. Por ejemplo, tras haber hecho una operación de resta te puede
interesar conocer no solo el resultado en sí, sino también si hubo o no
llevada, si el resultado ha sido positivo, negativo, etc.

FSR

Se emplea con el direccionamiento indirecto. Su contenido representa la dirección de memoria RAM de


datos a la que se desea acceder.

T-2.2.2.2 Accesorios

Consisten en unos circuitos auxiliares que mejoran las prestaciones del controlador haciéndolo más
flexible y versátil. Son muy parecidos en todos los dispositivos PIC de todas las familias. De momento
quédate simplemente con una idea general de los mismos. Quizá más adelante, cuando estés empeñado
en un proyecto, necesites hacer uso de ellos. Entonces será el momento de que los estudies con detalle, de
momento echa un vistazo al vídeo “Circuitos complementarios”.

 POR (Power On Reset) Este circuito detecta el momento en que la tensión de


alimentación alcanza el valor apropiado para realizar un RESET al controlador y dar así
inicio a la ejecución del programa.

 PWRT (PoWeR up Timer) Se trata de un temporizador que retrasa en unos 64 mS el


inicio de la ejecución tras conectar la alimentación del sistema. Este retardo puede serte

2-14
www.mkelectronica.com Microcontroladores PIC: Nivel I
útil si la alimentación con la que alimentas al equipo no es lo
suficientemente instantánea y tarda un tiempo en estabilizarse. La
puedes habilitar o no según te convenga.

 OST (Oscillator Start up Timer) Es otro temporizador que prolonga el


retraso de inicio de la ejecución en otros 1.024 ciclos del reloj principal
tras conectar la alimentación. Con esta nueva temporización añadida
garantizas que el oscilador que genera la frecuencia principal del
sistema, se estabilice plenamente.

 BOR (Brown Out Reset) Consiste en un circuito que supervisa


constantemente la tensión de alimentación que aplicas al controlador.
Cuando cae por debajo de un determinado umbral, provoca un RESET
y reinicia el sistema (si es que todavía hay alimentación). La tensión de
umbral puedes configurarla con diferentes valores.

 WDT (Watch Dog Timer) También es conocido como “perro guardián”


aunque yo prefiero llamarle “supervisor”. Se trata de un temporizador
ajustable. Lo puedes habilitar o no según te interese. Si lo habilitas, el WDT evoluciona de
forma independiente y constante hasta alcanzar el valor 0, momento en el que provoca un
RESET. El controlador se reinicia de nuevo. Para evitar
esta situación en principio no deseada, tú como
programador, debes colocar estratégicamente en tu
programa una instrucción que lo refresque de forma
periódica. Aunque parezca lo contrario, su empleo puede
ser muy importante en determinadas aplicaciones. Imagina
que el sistema, por el motivo que sea, se te bloquea. El
programa deja de ejecutarse y por tanto el refresco no se
produce. Transcurrido un tiempo el WDT se desborda y
provoca un RESET. El sistema se reinicia de forma
automática sin intervención alguna por tu parte.

Para configurar el modo de funcionamiento de estos accesorios dispondrás de los registros


apropiados. También tendrás la posibilidad de conocer las posibles causas que provocaron un RESET en el
sistema: conexión de alimentación (POR), fallo de alimentación (BOR), desbordamiento del WDT, por
activación de la patilla MCLR, etc… De esta forma puedes hacer diferentes secuencias de inicio. Quizá no
sea lo mismo iniciar el sistema cuando conectas la alimentación que iniciarlo cuando el WDT provoca un
desbordamiento.

T-2.2.2.3 Los circuitos de interface

Si hemos elegido el modelo PIC16F886 es


precisamente por la gran variedad de
circuitos o módulos para el interface y
control de periféricos que dispone, por lo
que tu esfuerzo merecerá la pena. Aunque
en este curso de inicialización a los PIC no
vas a trabajar con todos, sí voy a
explicarte, de forma resumida, las
posibilidades de cada uno de ellos. Quizá
en un futuro necesitas emplearlos, y será
entonces cuando debas estudiarlos en
profundidad. Por otra parte, debes tener en
cuenta que estos módulos son los mismos
o muy, pero que muy parecidos a los que
se emplean en cualquier dispositivo PIC de
cualquiera de las familias existentes.

2-15
www.mkelectronica.com Microcontroladores PIC: Nivel I
 Puertos de E/S Son los circuitos de interface
más empleados y fáciles de controlar. Lo forman
una serie de patillas que puedes configurarlas
individualmente para que actúen como entradas
o como salidas. Son del tipo digital. Esto es,
permiten sacar o leer niveles lógicos del tipo “1”
o “0”, “tensión” o “no tensión”. Con estas líneas
puedes gobernar multitud de periféricos de
salida tales como leds, displays, pantallas LCD,
relés, electroválvulas y un largo etc., y también
de periféricos de entrada como pulsadores,
interruptores, sensores, teclados y mucho más.
En ocasiones, es probable que tengas que
acondicionar adecuadamente las señales en estas patillas, para poder conectarlas con
ciertos periféricos. Por ejemplo, una línea configurada como salida, ofrece una corriente
de unos 25 mA. Obviamente con ella no podrás activar un relé cuya bobina consume 200
mA a 45 V. Tendrás que poner algún tipo de amplificador de corriente y de tensión. De
todas formas estas líneas o patillas se agrupan en torno a lo que se llaman “puertos” de
E/S: PORTA, PORTB, PORTC y PORTE. Los tres primeras están compuestas de 8 líneas
o patillas cada una: RA7:RA0, RB7:RB0 y RC7:RC0. En el PIC16F886 el PORTE sólo
consta de 1 línea, la RE3. Disponemos pues de un total de 25 patillas de E/S de las que
ya hemos hablado en el apartado dedicado a la descripción del patillaje. Te
recuerdo que estas patillas pueden tener múltiples funciones. Algunas de
ellas son empleadas por el resto de módulos como vas a ver ahora.

 TIMER0 Es un circuito temporizador de 8 bits que te permitirá controlar, con


precisión, lapsus de tiempo o temporizaciones. También puede actuar como
contador. En este caso los pulsos externos a contar se aplican por la patilla
T0CKI. A este temporizador se le puede asociar un circuito divisor o
preescaler, con el que puedes realizar temporizaciones o contajes más
grandes.

 TIMER1 Circuito temporizador de 16 bits. Además de realizar


temporizaciones y/o contaje de los pulsos externos que se
aplican por la patilla T1CKI, también tiene asociado un
oscilador de 32 KHz para aplicaciones en tiempo real. En este
caso, por las patillas T1OSI y T1OSO, debes conectar un
cristal de cuarzo de 32768 Hz.

Dispone de control de disparo externo mediante la patilla


/T1G. Con ella puedes controlar de forma externa la detención
y reanudación de una temporización o contaje.

El TIMER1 también participa en las labores de captura y


comparación de señales externas, junto con los módulos CCP.

 TIMER2 Se trata de otro temporizador de 8 bits al que se le puede asociar


tanto un preescaler como un postcaler. Participa activamente en la
generación de señales PWM.

 EUSART Es un módulo especializado en realizar comunicación serie estándar


tanto síncrona como asíncrona por sus patillas TX/CK y RX/DT. Esto supone
una puerta abierta para aplicaciones en las que nuestro controlador necesite
comunicarse con el mundo exterior. El EUSART está pensado para que nuestro
PIC se pueda comunicar con otro PIC, o con otros equipos como pueden ser un
PC, un receptor GPS, un transceptor Bluetooth o un módulo GSM/GPRS de
telefonía móvil por poner algún ejemplo.

En el modo asíncrono las patillas TX/CK y RX/DT se emplean como transmisión


(Tx) y recepción (Rx) de datos. En el modo síncrono de comunicaciones se
emplean como señal de reloj (CK) y de datos (DT).

2-16
www.mkelectronica.com Microcontroladores PIC: Nivel I
 ECCP Este módulo es una versión muy mejorada de los típicos módulos
CCP que integran otros dispositivos PIC. Permite la captura y
comparación de señales externas pero, está especialmente pensado para
generar señales PWM por las patillas CCP1/P1A, P1B, P1C y P1D.

Con estas patillas puedes controlar sistemas “Push-Pull” y puentes en H


muy empleados en aplicaciones de potencia.

El módulo ECCP tiene funciones para el control de dirección, modo auto-


shutdown o desconexión automática, temporizador ajustable para “Dead
Band” o banda muerta, etc..

 CCP2 Es la versión simplificada del módulo ECCP. Permite la captura y


comparación de señales así como generar una señal PWM simple por su
patilla CCP2. En el modo de captura, se recoge el valor de un
temporizador, el del TIMER1, cuando llega una señal por la patilla CCP2.
Puedes así medir la duración de esa señal, el lapsus de tiempo que
transcurre entre una señal y la siguiente, etc… En el modo de comparación
se dispara una señal por la patilla CCP2 cada vez que el TIMER1 alcanza
un valor prefijado. En el modo PWM por la patilla CCP2 se genera una señal modulada en
anchura. Esto es, el periodo de esa señal es fijo pero la duración del semiperiodo del nivel
“1”, es variable.

 MSSP También llamado puerta serie síncrona, se trata de otro módulo


especializado en las comunicaciones serie. Está pensado para realizar
comunicaciones entre el PIC y otros circuitos integrados como pueden
ser memorias de diferentes tipos y capacidades, conversores ADC y/o
DAC, sensores, relojes en tiempo real, y una amplia gama de dispositivos
existentes. Contempla los protocolos I2C e SPI tanto en el modo Master
como en Slave. Las patillas SCL y SDA se emplean en el protocolo I2C
como patillas de reloj y de datos respectivamente. En SPI se emplean las
patillas SDO, SDI, SCK y SS como patillas de salida de datos, entrada de
datos, señal de reloj y selección de Slave (esclavo).

 ADC Es otro potente módulo que consiste en un


convertidor analógico/digital. Realiza la conversión
de una tensión analógica en su equivalente valor
digital. Esto te permitirá que uses múltiples
periféricos de carácter analógico: sensores de luz,
presión, humedad, tensión, etc. Dispone de hasta 11
canales de entrada por las patillas AN0:AN13 y una
resolución de 10 bits.

La tensión de referencia que se emplea en las conversiones puede ser la propia tensión
de alimentación, o bien la que apliques a través de las patillas VREF+ y VREF-

 Comparadores El dispositivo PIC16F886 integra un


módulo con dos comparadores analógicos cada uno de
los cuales permite comparar dos tensiones analógicas
externas y ofrecer, por las patillas C1OUT y C2OUT,
unas salidas en función de si son o no iguales.

Las patillas de entrada invertidas para ambos


comparadores se pueden configurar y seleccionar entre
las patillas C12IN0-C12IN3.

También integra un generador de tensión de referencia que se puede emplear junto con
los comparadores.

2-17
www.mkelectronica.com Microcontroladores PIC: Nivel I
 Memoria EEPROM A todos los efectos la debes considerar como otro
periférico más. Este módulo realiza la gestión de una memoria EEPROM
integrada en el propio PIC y que permite almacenar datos no volátiles, pero
que se pueden modificar (claves, códigos de control, configuraciones del
sistema, etc.).

Mediante el registro interno EEADR seleccionas a qué posición de la


memoria deseas acceder. Dispone de 256 posiciones de 8 bits cada una. Si
realizas una operación de lectura, el dato leído de la posición indicada, lo
obtienes en el registro EEDATA. En una operación de escritura, el dato a
escribir lo debes colocar previamente en ese mismo registro.

 ICD (In Circuit Debugger) Este módulo es transparente de cara al usuario pero, aunque
no puedas actuar sobre él, sí que te aprovechas de su presencia. Consiste en un
hardware muy evolucionado integrado en el controlador que permite la
depuración del programa que se está ejecutando. Se conecta con
herramientas externas como pueden ser el ICD2, el ICD3, el PICkit2, etc.,
que permiten a su vez la comunicación con el PC. Desde este PC
podremos ejecutar el programa, evaluarlo, ejecutarlo paso a paso,
instrucción a instrucción, poner puntos de parada, visualizar y modificar los
registros internos, etc. En definitiva, se trata de una potente herramienta para la
depuración y puesta a punto de nuestros programas, a un coste muy asequible. Lo
utilizaremos con frecuencia.

T-2.2.3 El área de memoria de datos RAM

Se trata de una memoria volátil que usarás para que tus programas puedan guardar en ella todos
los datos temporales y variables que se vayan produciendo en el curso de la ejecución. En el modelo
PIC16F886 disponemos de un total de 368 bytes a nuestra entera disposición.

Además de esos bytes existen una serie de posiciones de memoria reservadas que reciben el
nombre de registros especiales o SFR (Special Function Registers). Estos registros los manejarás de la
misma forma que cualquier otro registro o posición de memoria RAM. Sin embargo, cada uno de ellos tiene
una determinada misión asignada que, salvo excepciones, está relacionada con el control y el
funcionamiento de los diferentes periféricos. Así, según el valor que escribas sobre ellos, su periférico
asociado se configurará y actuará de una u otra forma. Igualmente, si deseas conocer el estado de un
periférico, basta con que leas la información contenida en su registro SFR correspondiente.

No existen instrucciones especiales o adicionales para la gestión de los periféricos. Existen


registros especiales a los que se accede con las mismas instrucciones que a los registros normales
de memoria RAM. Hablamos de un juego reducido de instrucciones (RISC).

Tanto los registros especiales como las posiciones de memoria RAM del usuario se organizan en lo
que se denominan “bancos” de memoria de datos. En el caso del PIC que nos ocupa, los tienes en la figura
siguiente. Este sistema de bancos implica una gestión de la memoria RAM un tanto ineficaz. ¡¡ Cuando
deseas acceder a un registro, tienes que indicar su dirección y también seleccionar previamente el banco en
el que se encuentra !!

Hoy en día los modelos de la familia PIC18 y superiores no emplea esta técnica sin embargo, en
sus orígenes, el sistema de bancos estaba, bajo mi punto de vista, justificado. Hay que tener en cuenta que
los microcontroladores PIC han ido evolucionando constantemente con el tiempo. Los primeros modelos
tenían muy poca memoria y realmente no hubiera sido necesario utilizar esta técnica. En aquel entonces se
crearon las instrucciones necesarias y precisas para la gestión de la memoria que había disponible. Sin
embargo, con miras al futuro, la implantación de los bancos permitió que, a día de hoy, se conserven
aquellas mismas instrucciones, aunque los dispositivos actuales dispongan de mucha más memoria RAM.
Basta con cambiar algún bit en algún lugar para que se seleccione un banco diferente y, con las mismas
instrucciones, puedas gestionar todas sus posiciones.

2-18
www.mkelectronica.com Microcontroladores PIC: Nivel I
Es un detalle que debieras valorar positivamente, ya que de esta manera, se garantiza la
compatibilidad de software. Un programa escrito para un modelo de PIC antiguo se puede adaptar
fácilmente a otro modelo más actualizado. ¡Las instrucciones y sus operandos son iguales!

2-19
www.mkelectronica.com Microcontroladores PIC: Nivel I
A la vista de esa misma figura anterior puedes observar que algunos registros especiales (SFR)
están repetidos en varios bancos. Realmente se trata del mismo registro duplicado. Se considera que son
los registros que se usan con más frecuencia y que por tanto se debe poder acceder a los mismos en
cualquier momento, y sin necesidad de tener que seleccionar previamente el banco en que se encuentran.

Por último, un consejo. Los nombres de los registros SFR se corresponden con las siglas en inglés
que describen la función de los mismos. Puede que te resulten extraños y difíciles de memorizar. Sin
embargo es recomendable que te acostumbres a emplearlos tal cual. Ya se ha dicho que existe abundante
información técnica, literatura, notas de aplicación y ejemplos. En la mayor parte de ellas se emplean esos
mismos nombres, ya que son los originales asignados por Microchip. Con paciencia y poco a poco seguro
que lo consigues.

Como material complementario dispones de una Guía rápida de referencias con el listado completo
de los registros especiales SFR, y una breve descripción de los mismos. Están clasificados según
su función o módulo con el que están relacionados. Imprímela y archívala junto con otras guías que
irán apareciendo en el curso. Procura tenerlas siempre a mano para tu mayor comodidad.

Ahora tú
REGISTRO POSICIÓN BANCO(s)
PCLATH
Considera este sencillo ejercicio como un simple TRISB
entretenimiento. Se pretende que te vayas familiarizando con ANSEL
la búsqueda de los diferentes registros especiales (SFR) que ADRESL
se encuentran en el área de datos. Consulta la figura anterior PORTA
y completa la siguiente tabla indicando la posición y el TMR0
banco(s) en que se encuentran los registros indicados. OSCCON
BAUDCTL
TXREG
POSICIÓN BANCO REGISTRO WDTCON
0x05 0 CM2CON0
0x05 3
0x07 1
0x07 3
0x1C 0 Ahora, partiendo de una dirección y suponiendo que has
0x1C 1 seleccionado un determinado banco, anota en la siguiente
0x1C 2 tabla el nombre del registro al que accederías.
0x09 0
0x09 1
0x09 2
0x09 3

BANCO RANGO
Finalmente indica el rango de direcciones de memoria RAM 0
que dispones como usuario en los diferentes bancos, para que 1
puedas guardar tus propios datos y variables. 2
3

T-2.2.4 Los más especiales de los registros SFR

De entre todos los registros especiales hay dos que merecen especial atención. Se conservan
prácticamente igual que en los primitivos dispositivos que dieron origen al universo de los
microcontroladores PIC. Estamos hablando del registro de estado (STATUS) y del registro de opciones
(OPTION_REG). Estos, como todos los demás registros, están ubicados sobre el área de datos RAM, en
sus correspondientes posiciones y bancos según la ya conocida figura anterior.

2-20
www.mkelectronica.com Microcontroladores PIC: Nivel I
Para describir ahora la función de los bits de estos registros y, posteriormente de todos los demás,
vamos a emplear unas leyendas y convenciones que se asociarán a cada bit. Te indican qué puedes hacer
con cada uno de ellos y cuál es su estado inicial. Es un detalle importante y te conviene prestar atención:

 R Bit que se puede leer.


 W Bit que se puede modificar o escribir.
 U Para definir a ciertos bits de ciertos registros que no están implementados o no se usan.
 -1 Es un bit que se pone a nivel “1” por defecto cuando se conecta la alimentación.
 -0 Es un bit que se pone a nivel “0” por defecto cuando se conecta la alimentación.
 -x Representa a un bit cuyo estado inicial, al conectar la alimentación, es aleatorio.

T-2.2.4.1 El registro STATUS

Contiene información del estado de la CPU cuando se ejecutan determinadas instrucciones.


También dispone de una serie de bits con los que puedes seleccionar el banco de memoria del área de
datos RAM que vas a utilizar en un momento dado.

Nombre: STATUS (Registro de Dirección: Banco: todos


estado) 0x03
R/W-0 R/W-0 R/W-0 R-1 R-1 R/W-x R/W-x R/W-x
IRP RP1 RP0 /TO /PD Z DC C

IRP Selección de bancos de memoria RAM en el direccionamiento indirecto


1 = Bancos 2 y 3 (0x100 a 0x1FF)
0 = Bancos 0 y 1 (0x00 a 0xFF)
RP<1:0> Selección de bancos de memoria RAM en el direccionamiento directo
00 = Banco 0 (0x00 a 0x7F)
01 = Banco 1 (0x80 a 0xFF)
10 = Banco 2 (0x100 a 0x17F)
11 = Banco 3 (0x180 a 0x1FF)
/TO Bit de desbordamiento
1 = Tras conectar alimentación o ejecutar las instrucciones CLRWDT o SLEEP
0 = Desbordamiento del WDT o Watch Dog (perro guardián o supervisor)
/PD Bit de bajo consumo
1 = Tras conectar la alimentación o ejecutar la instrucción CLRWDT
0 = Al ejecutar la instrucción SLEEP
Z Cero
1 = El resultado de una determinada operación aritmético/lógica es igual a 0
0 = El resultado de una operación aritmético/lógica es distinto de 0
DC Llevada decimal (con las instrucciones ADDWF, ADDLW, SUBWF y SUBLW)
1 = Llevada en el 4º bit tras una suma. No hay llevada tras una resta
0 = No hay llevada en el 4º bit tras una suma. Hay llevada tras una resta
C Llevada (con las instrucciones ADDWF, ADDLW, SUBWF y SUBLW)
1 = Llevada en el 8º bit tras una suma. No hay llevada tras una resta
0 = No hay llevada en el 8º bit tras una suma. Hay llevada tras una resta

Ejemplos

Mediante unos cuantos ejemplos se trata de que aprendas a interpretar la información que te
proporciona del registro STATUS. En primer lugar vas a realizar una serie de sencillos cálculos matemáticos
como sumar y restar dos números. El objetivo es analizar cómo quedarán los bits Z, DC y C del registro
STATUS para diferentes resultados. Recuerda que un controlador es un dispositivo digital que únicamente
es capaz de manejar códigos o números binarios. Es más, nuestro controlador es de 8 bits. Esto quiere
decir que todas las operaciones las realiza con valores de 8 bits (8 bits = 1 byte) y los resultados que genera

2-21
www.mkelectronica.com Microcontroladores PIC: Nivel I
también son de 8 bits. El valor máximo es por tanto de 255
8
= 0xFF = 11111111, (2 ). Concatenando varias operaciones
de 8 bits puedes realizas cálculos tan grande como
necesites.

Doy por supuesto que estás familiarizado con


operaciones entre números binarios o hexadecimales y, por
supuesto, con los números decimales. De no ser así, te
puedes ayudar de una calculadora científica que te permita
operar con este tipo de números, o bien utilizar la
calculadora que incluye el propio Windows. Esta se muestra
en la figura y está configurada para trabajar a nivel de Word
(16 bits). Haciendo la selección apropiada puedes
representar un mismo número en binario, octal, decimal y
hexadecimal.

Nº HEX. BIN. DEC. Supongamos tres números A, B y C cuyos valores tanto en binario,
A 0x8C 10001100 140 hexadecimal como en decimal se muestran en la tabla. Con ellos vamos a
B 0x1B 00011011 27 realizar varias operaciones y a explicar cómo los resultados de cada una
C 0x92 10010010 146
afectan a los bits Z, DC y C del registro STATUS.

OPERA- RESULTADO STATUS DESCRIPCION


CIÓN HEX. BIN. DEC. Z DC C
El resultado no excede de 255, por lo que no
A+B 0xA7 10100111 167 0 1 0 hay llevada en el 8º bit (C=0). Sí la hay en el 4º
bit (DC=1).
A+C 0x1E 00011110 30 0 0 1 El resultado excede de 255 por lo que hay
llevada en el 8º bit (C=1)
A–B 0x71 01110001 113 0 1 1 No hay llevada en el 8º ni en el 4º bit, C y DC=1.
En las restas C y DC están invertidos.
A–A 0x00 00000000 0 1 1 1 El resultado es igual a 0 (Z=1). En las restas C
y DC están invertidos.
B–C 0x89 10001001 -119 0 1 0 Hay llevada y el resultado es negativo (C=0). En
las restas C y DC están invertidos.

BANCO VALOR
También puedes usar el registro STATUS para seleccionar cada uno de 0 000X XXXX
los bancos en que se organiza la memoria RAM del área de datos. Basta que 1 001X XXXX
escribas el valor apropiado en sus tres bits de más peso, los de la izquierda (IRP, 2 110X XXXX
RP1 y RP0). Mira la siguiente tabla. 3 111X XXXX

T-2.2.4.2 El registro OPTION_REG

Contiene varios bits con los que se controla el funcionamiento de algunos circuitos o módulos del
microcontrolador. No te preocupes si todavía no hemos hablado de ellos:

 Resistencias Pull-Up. Permite conectar o no ciertas resistencias de carga asociadas a las patillas
del Puerto B cuando se configuran como entradas.
 Interrupción externa. Selecciona si la señal de interrupción aplicada por la patilla RB0/INT es
activa al flanco ascendente o descendente.
 Timer 0. Si para realizar la temporización se va a emplear una fuente de reloj externa aplicada por
la patilla RA4/T0CKI, o bien el reloj general del sistema.
 Preescaler. Permite asociar el preescaler al temporizador Timer 0 o al supervisor WDT. Además
selecciona el factor de división con el que se prolongarán las temporizaciones de uno de los dos.

2-22
www.mkelectronica.com Microcontroladores PIC: Nivel I
Nombre: OPTION_REG Dirección: 0x01 Bancos: 1 y 3
R/W-1 R/W-1 R/W-1 R/W-1 R/W-1 R/W-1 R/W-1 R/W-1
/RBU INTEDG T0CS T0SE PSA PSA2 PSA1 PSA0

/RBPU Activación de las resistencias Pull-Up del Puerto B


1 = Resistencias Pull-Up deshabilitadas
0 = Resistencias Pull-Up habilitadas
INTEDG Selección del flanco activo de la interrupción externa por la patilla RB0/INT
1 = Interrupción sensible al flanco ascendente
0 = Interrupción sensible al flanco descendente
T0CS Selección de reloj para el Timer 0 (TMR0)
1 = Reloj externo por la patilla RA4/T0CKI
0 = Reloj interno del sistema (Fosc/4)
T0SE Selección del flanco activo del reloj externo para el TMR0
1 = El TMR0 evoluciona con cada flanco descendente por la patilla RA4/T0CKI
0 = El TMR0 evoluciona con cada flanco ascendente por la patilla RA4/T0CKI
PSA Asignación del preescaler
1 = El preescaler se asigna al Watch Dog (WDT)
0 = El preescaler se asigna al temporizador Timer 0 (TMR0)
PS<2:0> Selección del valor del prescaler
000 = 1:2 si es para el TMR0; 1:1 si es para WDT
001 = 1:4 si es para el TMR0; 1:2 si es para WDT
010 = 1:8 si es para el TMR0; 1:4 si es para WDT
011 = 1:16 si es para el TMR0; 1:8 si es para WDT
100 = 1:32 si es para el TMR0; 1:16 si es para WDT
101 = 1:64 si es para el TMR0; 1:32 si es para WDT
110 = 1:128 si es para el TMR0; 1:64 si es para WDT
111 = 1:256 si es para el TMR0; 1:128 si es para WDT

Ahora tú

Si deseas que las cargas Pull-Up estén activadas, la interrupción sea sensible al flanco ascendente,
el Timer 0 funcione con el reloj general del sistema y tenga un preescaler de 1:64, anota el valor binario que
debes cargar en este registro:

OPTION_REG = ___________________________________

A la vista de los datos que tienes, describe cómo quedan configurados por defecto los módulos
controlados por el registro OPTION_REG cada vez que conectas la alimentación al controlador:

 Interrupción externa: ________________________________________________

 Preescaler asociado al: ______________________________________________

 El Timer 0 emplea reloj: ______________________________________________

 Valor del preescaler: ________________________________________________

 Cargas Pull_Up: ___________________________________________________

 Flanco activo para el reloj del Timer 0: _________________________________

Ahora, anota a continuación la dirección y el banco de la primera posición de memoria RAM del área
de datos que tienes disponible para guardar tus variables: __________________________

2-23
www.mkelectronica.com Microcontroladores PIC: Nivel I
T-2.2.5 El área de memoria de programa FLASH

El PIC16F886 integra un espacio total de 8 K posiciones de


memoria Flash para albergar nuestros programas. En cada posición
cabe una instrucción completa de 14 bits que definen a la propia
instrucción y a los parámetros que precisa (recuerda la arquitectura
Harvard). Tal y como puedes ver en la figura éste área de memoria
está bajo el control absoluto del llamado Contador de Programa (PC),
que en todo momento apunta a la dirección donde se encuentra la
siguiente instrucción a ejecutar. El PC consta de 13 bits, por lo que es
13
capaz de direccionar 8.192 posiciones diferentes (2 ).

El área de programa también se organiza en páginas de


memoria por los mismos motivos que se explicaron con anterioridad.
Los primeros dispositivos no alcanzaban ni de lejos la capacidad de 8
K. Disponían desde 512 posiciones hasta 2 K de memoria como
máximo. Por este motivo, las instrucciones que se crearon entonces
permitían moverse libremente a lo largo de un rango de 2 K posiciones
de la memoria de programa. No obstante, con vistas al futuro,
implementaron un PC de 13 bits y un registro, el PCLATH, que permite
seleccionar una de entre las múltiples páginas que pudieran llegar a
implementarse. A pesar de que como programador tengas que
preocuparte de controlar la página de memoria de programa en la que te estás moviendo, esta técnica
presenta dos ventajas:

 Disponemos de dispositivos PIC con muy poca memoria de programa pero muy baratos y
que pueden servir en múltiples aplicaciones.

 Se garantiza compatibilidad total a nivel de software entre esos dispositivos y otros más
modernos y con más memoria de programa. Emplearás las mismas instrucciones y tan
sólo tendrás que seleccionar el banco apropiado en cada momento.

En el área de programa también se reservan dos posiciones muy especiales:

 Vector de RESET (posición 0x0000). Cada vez que conectas la tensión de alimentación o se
produce una señal de RESET, el PC se carga con 0x0000 y comienza la ejecución desde esta
dirección. Lo normal es que la primera sea una instrucción de “Salto” que dirija al PC a la dirección
donde realmente comienza tu programa.

 Vector de interrupción (posición 0x0004). Cada vez que se produzca cualquiera de las posibles
interrupciones, el PC se dirige a esta dirección. Normalmente aquí colocarás otra instrucción de
“Salto” que dirija al PC a la dirección donde comienza tu programa de tratamiento de la interrupción.

Por último, comentar la presencia de la memoria de stack. Se trata de una memoria especial que se
gestiona automáticamente sin intervención directa del programador. En determinadas ocasiones, es capaz
de salvaguardar el valor actual del PC, y esto ocurre cuando ejecutas un salto a subrutina o bien se produce
una interrupción. Al finalizar esa subrutina y/o interrupción, el PC se repone con el valor original que tenía y
que se salvó en esta memoria de stack. Hay ocho niveles o registros de stack, lo que permite anidar hasta
ocho saltos a subrutinas salvaguardando el valor del PC en cada una de ellas.

2-24
www.mkelectronica.com Microcontroladores PIC: Nivel I
AREA DE PRÁCTICAS

P-2.1 EL SOFTWARE MPLAB-IDE

Aunque en la red existe gran variedad de herramientas software proporcionadas por terceras
fuentes, podemos afirmar que el MPLAB-IDE (Integrated Development Environment/ Entorno integrado de
desarrollo) es la herramienta software por excelencia. Es original de Microchip y la última versión disponible
se puede descargar de forma gratuita desde www.microchip.com.

Aquí tienes unos cuantos motivos por los que recomendamos su empleo:

 Es gratis y original de Microchip. Se encuentra en constante evolución y esto garantiza


una total actualización. Su funcionamiento es muy fiable.

 Admite todos los dispositivos PIC existentes de todas las familias.

 Permite trabajar con todas las herramientas hardware originales de Microchip que
estudiaste en la Unidad 1: MPLAB-REAL ICE, MPLAB-PM3, PICSTART PLUS, ICD-
2/ICD-3, PICKit-2/PICkit-3, ICD-PIC y, por supuesto, el laboratorio USB-PIC’School ya que
es compatible con PICkit-2.

 Integra un potente editor de programas fuente, un ensamblador y un simulador. También


es capaz de enlazar con compiladores de lenguajes de alto nivel que comercializa tanto
Microchip como otros fabricantes.

 En resumidas cuentas, es una plataforma única que integra todo lo necesario para
acometer un proyecto basado en microcontroladores PIC desde el principio hasta el fin.

Todos los ejemplos y proyectos incluidos en este curso se han desarrollado empleando esta potente
herramienta software. Aunque está desarrollada en Ingles, espero que te familiarices con ella y la uses sin
mayores problemas. Todavía no tienes la suficiente base como para empezar a escribir tus propios
programas por sencillos que estos fueran, pero sí que puedes tener una primera toma de contacto con el
entorno MPLAB-IDE. En cualquier caso debes saber que desde estas líneas no se pretende sustituir al
manual de usuario original del MPLAB-IDE.

En el material complementario que acompaña a esta Unidad 2 puedes descargar la versión MPLAB-
IDE V 8.92 y el manual de usuario MPLAB-IDE User guide.

En el momento de escribir estas líneas la última herramienta software que propone Microchip es el
conocido como MPLAB X IDE. Se trata de una herramienta gratuita y multiplataforma que puede trabajar en
entornos Windows, Mac o Linux. Sin embargo NO contempla el empleo de herramientas hardware como
son el ICD-2 ni el PICkit-2, ni por tanto, el laboratorio USB-PIC’School que vamos a usar en las prácticas.

P-2.1.1 Instalación de MPLAB-IDE

Lógicamente el primer paso será instalar el programa. Cuando lo descargues desde el material
complementario que acompaña a esta unidad, obtienes un único fichero comprimido con la última versión
disponible. Lo guardas en una carpeta temporal y lo descomprimes.

Obtienes así el clásico fichero “Setup” que ejecutarás para comenzar con la instalación. Ésta es
totalmente automática como en la mayor parte de programas Windows. Basta con contestar a unas sencillas
preguntas de reconocimiento de derechos de autor así como de ubicación del propio programa.

Una vez instalado, en tu escritorio tendrás un nuevo icono sobre el que harás doble
click para comenzar con la ejecución. Aparecerá el área de trabajo similar a la mostrada en
la figura. En la parte superior tienes todas las opciones disponibles del menú principal.

2-25
www.mkelectronica.com Microcontroladores PIC: Nivel I
Vamos a hablar ahora de ellas. Sugiero que las vayas explorando con objeto de ir familiarizándote. Piensa
que son las herramientas que vas a emplear en todos tus desarrollos y proyectos y es por tanto necesario
que las conozcas.

P-2.1.2 Configure

Aunque intentaremos seguir un orden, vamos a empezar con esta


opción ya que nos proporciona una información muy valiosa y permite realizar
importantes tareas. Contiene a su vez, varios comandos como se muestran en
la figura y con los que debes experimentar.

Select Device

Es probablemente el comando más obvio. ¡Qué


menos que seleccionar el modelo de
microcontrolador con el que vamos a trabajar!
Además, este comando nos proporciona una
información muy interesante tal y como puedes
ver en la figura.

Con el desplegable “Device Family” puedes


seleccionar la familia de productos Microchip y
con “Device” un dispositivo en particular. En este
caso se ha seleccionado a nuestro modelo
PIC16F886.

Mediante una serie de luces verdes y rojas se


informa sobre qué herramientas están o no
disponibles para el dispositivo seleccionado. En
la figura puedes ver que prácticamente está todo
habilitado, incluyendo el depurador/grabador
PICKit-2 que es compatible con el depurador del
laboratorio USB-PIC’School. Prueba a seleccionar otros dispositivos para que veas qué es lo que está
disponible o no.

Configuration bits

Este comando de la opción “Configure” te permite visualizar y ajustar la palabra de configuración del
controlador. De momento simplemente debes saber que mediante esta palabra se establecen diferentes
opciones de trabajo del PIC: tipo de oscilador, protección o no de la memoria de programa, habilitación o no

2-26
www.mkelectronica.com Microcontroladores PIC: Nivel I
del supervisor WDT, configuración de la patilla MCLR, etc... Aunque la estudiarás más adelante, ahora es
un buen momento para analizar la configuración de nuestro PIC16F886 (o cualquier otro), y las diferentes
opciones disponibles tal y como se muestra en la figura. Las distintas opciones de configuración las podrás
establecer desde el programa fuente, o bien manualmente mediante este comando.

User ID Memory

Una característica de los microcontroladores PIC es la


posibilidad de grabarles un código de identificación o número de
serie que te permita identificarlo como un producto tuyo. Este
código llamado ID se puede establecer desde el programa fuente o,
manualmente, mediante este comando.

Settings

Con este comando se ajustan una serie de


parámetros relacionados con el propio entorno de
trabajo del MPLAB-IDE, no del PIC. Estos
parámetros se organizan en fichas, donde cada
ficha presenta a su vez, una serie de opciones que
se pueden o no activar. En el caso de la figura se
ha seleccionado la ficha “Program Loading” que
permite determinar qué debe hacer el MPLAB-ID
cada vez que se cargue un nuevo programa. Es un
buen momento para ver el contenido de las demás
fichas.

P-2.1.3 File

Como puedes ver en la figura, la opción “File” del menú


principal presenta una serie de comandos relacionados con la
gestión de ficheros. Hay comandos que te permiten iniciar, abrir,
cerrar, agregar y salvar ficheros. Normalmente estos ficheros se
corresponden con programas fuente escritos en ensamblador
(*.ASM) o en lenguaje C (*.C), y también con ficheros de cabecera
o librerías (*.H o *.INC) que se pueden incluir en los anteriores.

También puedes abrir, cerrar o salvar entornos de trabajo


o “Workspace”. Se tratan de ficheros con extensión *.MCW que
describen el estado actual de tu área de trabajo, tipo de
procesador, ventanas abiertas, localización de las mismas, etc.

2-27
www.mkelectronica.com Microcontroladores PIC: Nivel I
Puedes salvar así tu entorno y al día siguiente recuperarlo tal y como lo dejaste. Es posible importar
(recuperar) y exportar (salvar) ficheros binarios con extensión *.HEX que contienen toda la información que
se va a grabar sobre el PIC: memoria de programa, EEPROM de datos, palabra de configuración y código
ID. Normalmente este tipo de ficheros lo emplean los equipos de
grabación.

P-2.1.4 Edit

Mediante esta opción se accede a todos los comandos típicos


de un editor de textos. El editor de textos es la herramienta que vas a
emplear para escribir cualquier programa fuente bien sea en
ensamblador, en C, o en cualquier otro lenguaje.

Dispones de comandos para seleccionar texto, borrarlo,


copiar, pegar, deshacer y rehacer. Tienes comandos para buscar
texto, reemplazarlo, crear marcas, desplazarse por ellas, etc.
También existe la posibilidad de establecer las propiedades del texto
como son el tipo de letra, el tamaño, color y mucho más.

Tienes una buena ocasión de practicar con todos ellos. Basta


que con File  New, abras una nueva ventana y comiences a escribir
cualquier tipo de texto. Esto a su vez te permite experimentar con
algunos de los comandos de la opción File que vimos anteriormente.
Ya te llegará la hora de escribir auténticos programas fuente.

P-2.1.5 View

Los comandos de esta opción te dan la oportunidad de abrir


diferentes ventanas para visualizar diferentes tipos de objetos:
estructura de un proyecto, ventana “output” con los distintos
mensajes de salida y barras de tareas. También puedes visualizar
y/o modificar las diferentes secciones del controlador como son la
memoria EEPROM, la memoria RAM de datos, el estado del
stack, la memoria FLASH de programa, los registros especiales
SFR, las variables del usuario o Watch, etc…

En una sesión habitual de trabajo puede resultarte muy útil tener a


la vista diferentes ventanas con distintas secciones del
controlador. Esto te permitirá su análisis y/o modificación según
te convenga.

Cuando abrimos y colocamos las ventanas que deseamos,


estamos creando lo que se llama un entorno de trabajo o
“Workspace”. Este entorno lo puedes guardar en un fichero para
que al día siguiente, al continuar con la sesión de trabajo, lo
puedas recuperar tal y como lo dejaste el día anterior.

Para que te hagas una idea, en la siguiente figura te muestro mi


entorno de trabajo favorito con las ventanas que empleo con
mayor frecuencia. Arriba, justo bajo las opciones del menú principal, coloco la barra de las herramientas
disponibles. Se representan mediante una serie de iconos que representan a los comandos más utilizados.
Así los puedo utilizar de forma rápida y cómoda.

2-28
www.mkelectronica.com Microcontroladores PIC: Nivel I
2-29
www.mkelectronica.com Microcontroladores PIC: Nivel I
Un poco más abajo, a la izquierda, me gusta tener la ventana donde voy a escribir y editar el
programa fuente de mi proyecto (*.ASM o *.C). Aprovecha la ocasión para ver el aspecto que tiene un
programa fuente como el que se muestra en la figura anterior. A la misma altura, pero a la derecha, pongo la
ventana “Output”. En ella se visualizan todos los mensajes que genera el MPLAB-IDE como pueden ser
errores y avisos que se producen al ensamblar y/o compilar el programa fuente, o bien mensajes que se
producen en la comunicación con las herramientas hardware que estés usando.

Abajo a la izquierda suelo tener abierta la ventana “File Register”. Visualiza el contenido de la
memoria RAM de datos. Conforme se va ejecutando un programa, dicho contenido se va modificando y
actualizando de acuerdo a las instrucciones ejecutadas. También lo puedes modificar directamente de forma
manual. Es una forma de introducir los datos que serán evaluados y procesados por el programa en
ejecución.

Finalmente, abajo a la derecha, me gusta disponer de la ventana “Watch” que para mí, es muy
importante. En ella puedes visualizar y/o modificar tanto los registros especiales SFR como las posiciones
de memoria RAM de datos o variables que desees. Los puedes ir añadiendo a la lista, indicando su nombre
(si está definido) o su dirección. Además, y esto es importante, su contenido lo puedes representar en
hexadecimal, decimal, ASCII o en binario. Basta con seleccionar uno de ellos y, con el botón derecho, hacer
click en sus propiedades. La ventana “Watch” dispone también de varias fichas en las que podemos agrupar
esas variables, según el tipo de información que contengan, o según un contexto determinado: una ficha
con los registros SFR, otra con las variables de salida, otra con las de entrada, etc.

Como te decía, éste es mi entorno de trabajo preferido que, lógicamente, puedo modificar según me
convenga. Ahora es un buen momento para que tú experimentes abriendo diferentes ventanas y
ubicándolas donde desees. También puedes modificar el contenido de cualquiera de los registros tanto de
la ventana “File Registers” como de la ventana “Watch” y seleccionar las propiedades de estos. Por último,
también puedes probar a salvar y recuperar este entorno de trabajo mediante los comandos “Workspace” de
la opción “File”. Insisto, de momento no tienes ningún PIC conectado con el PC, así que no vas a estropear
nada.

P-2.1.6 Project

Un proyecto consiste en definir y aglutinar en un único


archivo con extensión *.MCP, todos los parámetros de trabajo de
nuestra aplicación. En un proyecto se define: el modelo de PIC, el
lenguaje de programación que vas a emplear, nombre del fichero
con el programa fuente y carpeta en donde se encuentra,
herramientas de emulación o depuración (si se usan),
configuración de las mismas, entorno y ventanas de trabajo, etc…

El gestor de proyectos te facilita el trabajo de forma


notable. Un proyecto lo defines una única vez y lo empleas tantas
veces como lo necesites. Simplemente lo abres en cada ocasión.

En cuanto empieces a realizar ejemplos reales, en las


próximas unidades, tendrás la oportunidad de utilizar el gestor de
proyectos para cada uno. De momento basta que sepas, tal y
como se muestra en la figura, que con la opción “Project”
dispones de una serie de comandos con los que puedes iniciar un
nuevo proyecto, abrir uno ya existente, salvarlo, cerrarlo, añadirle
nuevos ficheros fuente, compilarlo, etc…

2-30
www.mkelectronica.com Microcontroladores PIC: Nivel I
T-2.1.7 Debugger

En un primer momento esta opción presenta dos únicos


comandos “Select Tool” y “Clear Memory”. Con el primero
puedes seleccionar la herramienta de Emulación,
Depuración o Simulación que vas a emplear. De algunas
de ellas ya se ha hablado en la unidad anterior. Como
puedes ver en la figura, se ha seleccionado el simulador
MPLAB SIM. El simulador es una herramienta gratuita
incluida en el MPLAB IDE que “simula” el funcionamiento
de un programa a pesar de no haber ningún PIC conectado
físicamente al PC. Lo vas a utilizar en los primeros
programas básicos de ejemplo. Más adelante usarás el
depurador PICkit-2 para ejecutar programas reales, y que
es compatible con el depurador del laboratorio USB-
PIC’School.

Por su parte el comando “Clear Memory”, nos brinda la oportunidad de borrar cualquiera de las
diferentes regiones de memoria que tiene un PIC: Memoria FLASH de Programa, Memoria RAM de datos,
memoria EEPROM de datos y palabra de configuración.

Una vez que has seleccionado una herramienta, (en el


ejemplo el MPLAB SIM), la misma opción “Debugger”, abre una serie
de comandos relacionados con las tareas propias de la simulación,
emulación o depuración.

Con estos comandos puedes ejecutar un programa en tiempo


real (Run), ejecución con animación de forma que el contenido de las
ventanas que estuvieran abiertas se vayan actualizando (Animate),
detener la ejecución (Halt), ejecución paso a paso (Step Into),
ejecución de un bloque (Step Over), etc…

Puedes provocar un Reset del PIC y, según la herramienta


que dispongas, puedes establecer sencillos o complejos puntos de
parada o Breakpoints, generar estímulos externos de simulación y
mucho más.

Mediante “Settings” también puedes configurar ciertos


parámetros de la emulación, depuración o simulación en función de la
herramienta hardware que dispongas: velocidad de trabajo, tipo de
mensajes emitidos por el MPLAB-IDE, opciones de trazado, etc…

La mayor parte de estos comandos los vas a utilizar cuando empieces a simular o a depurar
ejemplos reales en las siguientes unidades. Algunos de ellos son tan habituales que, una vez eliges una
herramienta de depuración, automáticamente aparece una nueva barra de herramientas con los iconos que
representan a esos comandos:

2-31
www.mkelectronica.com Microcontroladores PIC: Nivel I
1. Run. Ejecución del programa en tiempo real.
2. Halt. Detener la ejecución.
3. Animate. Ejecución con animación y actualización de las ventanas.
4. Step Into. Ejecución paso a paso.
5. Step Over. Ejecución en tiempo real de un bloque de instrucciones, una rutina o una función.
6. Step Out. Ejecución en tiempo real hasta salir de un bloque de instrucciones, rutina o función.
7. Reset. Provoca un Reset del controlador.
8. Breakpoint. Accede a una ventana donde se establecen los puntos de parada.

P-2.1.8 Programmer

La opción “Programmer” del menú principal te


permite elegir qué modelo de grabador vas a
emplear. Aparece una lista con todos los modelos
disponibles, algunos de los cuales ya hemos
comentado. En un futuro elegiremos el PICkit-2
que es compatible con el Depurador/grabador que
integra el laboratorio USB-PIC’School. Hay que
decir que una misma herramienta, como el PICkit-
2, puede emplearse para depuración o para
grabación, pero NO puede estar habilitada al
mismo tiempo para ambas tareas.

Una vez seleccionado el modelo de grabador, la


opción “Programmer” nos presenta los comandos
característicos relacionados con el proceso de
grabación de un PIC. En la figura hemos supuesto que elijes el PICkit-2 (compatible con el laboratorio USB-
PIC’School).

Entre las tareas típicas se encuentran programar el PIC, leerlo,


verificarlo, borrarlo, comprobar previamente si está borrado y leer la
EEPROM de datos.

A veces suele ser necesario conectar el PC con el grabador cuando,


por algún motivo, se pierde la conexión entre ambos (Connect).
Ocasionalmente también puede ser necesario actualizar el firmware interno
del propio grabador. Esto puede ocurrir cuando se instala una nueva versión
del MPLAB-IDE. Se realiza mediante el comando Download OS.

También es posible que el grabador mantenga al PIC en estado de


Reset (Hold in Reset) o salga de él (Release from Reset) y aplicarle o no
tensión Vdd de alimentación. Por último tienes la posibilidad de ajustar
ciertos parámetros del grabador mediante el comando Settings.

Todos estos comandos los utilizarás cuando quieras grabar un PIC


con tu programa definitivo y funcional. Lo harás más adelante, pero de
momento decir que algunos de estos comandos son tan habituales que, una vez elegido el grabador,
automáticamente aparece una nueva barra de herramientas con los iconos que los representan.

2-32
www.mkelectronica.com Microcontroladores PIC: Nivel I
1. Program the target device. Grabar el contenido actual de la memoria de programa, EEPROM de
datos, configuración y el valor ID de identificación del MPLAB-IDE, físicamente sobre sus
homólogas en el PIC.
2. Read the target device. Leer el contenido del PIC y depositarlo en el área de memoria de
programa, EEPROM de datos, de configuración y de identificación del MPLAB-IDE.
3. Read the target EEDATA memory. Leer el contenido de la memoria EEPROM de datos del PIC y
depositarlo en el área de datos EEPROM del MPLAB-IDE.
4. Verify the contents of the target device. Comparar y verificar el contenido físico de las diferentes
regiones de memoria del PIC con sus correspondientes en el MPLAB-IDE.
5. Erase the target device memories. Borra físicamente las diferentes regiones de memoria del
controlador PIC.
6. Verify that target memories are erased. Verifica que las diferentes regiones de memoria del PIC
están borradas.
7. Bring target MCLR to Vdd. Pone a nivel “1” la señal MCLR del PIC.
8. Brint target MCLR to Vil. Pone a nivel “0” la señal MCLR del PIC.
9. Re-establish PICkit 2 connection, re-check device ID, power, etc. Restablece la comunicación con
el grabador (el PICkit-2), comprueba su identificación interna, alimentación, etc.

T-2.1.9 Tools

Podemos decir que, de momento, esta opción no va con


nosotros. En ella se encuentran una serie de herramientas software
que Microchip suministra de forma gratuita o de pago. En la versión
8.92 de MPLAB-IDE están incluidas las que se muestran en la figura.

Piensa que Microchip emplea el MPLAB-IDE como plataforma


para el desarrollo de aplicaciones con todos sus productos,
independientemente de que sean o no microcontroladores. Con estas
herramientas se pretende dar soporte o, al menos, facilitar el empleo
de los mismos. Se recomienda acceder a su web para obtener
información de primera mano.

T-2.1.10 Window

Esta opción es clásica en la mayor parte de los programas desarrollados para


plataformas Windows. Como se muestra en la figura ofrece una serie de
opciones relacionadas con la organización y distribución de las ventanas:
cerrarlas, organizarlas en cascada, en sentido horizontal, vertical, etc.

T-2.1.11 Help

La opción “Help” proporciona ayuda de primera mano sobre el


MPLAB-IDE. Mediante el comando “Topics” podemos encontrar información
técnica completa de las diferentes herramientas tanto hardware como
software admitidas. Con “Release Notes” puedes acceder a documentación
de diferente tipo. También comprobar si hay alguna nueva actualización y
acceder a diferentes enlaces en Internet. Dispones pues de una abundante
información (en inglés) cuya lectura es más que aconsejable y a la que
puedes acceder en cualquier momento.

2-33
www.mkelectronica.com Microcontroladores PIC: Nivel I
En el material complementario incluido en esta Unidad 2 dispones del vídeo “Introducción al
MPLAB”. Es un buen momento para echarle un vistazo.

2-34
www.mkelectronica.com Microcontroladores PIC: Nivel I
UNIDAD 3: EMPEZANDO A TRABAJAR

OBJETIVOS

Se trata de unidad eminentemente práctica en la que tendrás un primer contacto con la


programación y las herramientas de trabajo. En el área de teoría se van a explicar 5 instrucciones muy
elementales. La siguiente Unidad, la 4, es donde estudiarás todas las instrucciones del controlador en
profundidad.

En el área de prácticas vas a usar esas 5 instrucciones para confeccionar tus primeros programas.
Serán programas muy simples, pero con ellos aprenderás cómo se escriben, cómo se ensamblan y cómo se
simulan y comprueba su funcionamiento.

Todo lo que aquí aprendas lo podrás utilizar en las siguientes unidades, en donde realizarás
programas más complejos y emplearás herramientas hardware para la depuración.

ÁREA DE TEORÍA

T-3.1 Introducción
T-3.2 Instrucciones básicas
T-3.2.1 Cargar el registro W (MOVLW)
T-3.2.2 Guardar el registro W (MOVWF)
T-3.2.3 Sumar W (ADDLW)
T-3.2.4 Restar W (SUBLW)
T-3.2.5 Instrucción de salto (GOTO)
T-3.2.6 Ahora tú

ÁREA DE PRÁCTICAS

P-3.1 Introducción
P-3.2 Edición del primer programa fuente: “Ejemplo 3-1.asm”
P-3.3 Creación de un proyecto
P-3.3.1 Iniciando el gestor de proyectos
P-3.3.2 Selección del dispositivo
P-3.3.3 Selección del lenguaje
P-3.3.4 Asignando un nombre al proyecto
P-3.3.5 Asignando programas fuente al proyecto
P-3.3.6 Finalizando la creación del proyecto
P-3.3.7 Comandos de la opción Project

P-3.4 Ensamblar / Compilar


P-3.4.1 Iniciando el ensamblado

P-3.5 Simulación
P-3.5.1 Preparando el entorno de trabajo
P-3.5.1.1 Botones de depuración
P-3.5.1.2 La ventana Stopwatch
P-3.5.1.3 La ventana del programa fuente
P-3.5.1.4 La ventana Output
P-3.5.1.5 La ventana File Registers
P-3.5.1.6 La ventana La ventana Watch
P-3.5.1.7 Desactivar el Watchdog WDT

P-3.5.2 Ejecución paso a paso

3-1
www.mkelectronica.com Microcontroladores PIC: Nivel I
P-3.5.3 Ejecución con puntos de parada
P-3.5.4 Ejecución en tiempo real
P-3.5.5 Ejecución con animación
P-3.5.6 Ejecución de funciones o subrutinas

P-3.6 Trabajo personal

MATERIAL COMPLEMENTARIO

 MPASM User’s guide


 Ejemplos Unidad 3
 Videos
o 1.- Creando un proyecto
o 2.- Ensamblado
o 3.- Simulación
 Soluciones Unidad 2
 Cuestionario

3-2
www.mkelectronica.com Microcontroladores PIC: Nivel I
AREA DE TEORÍA

T-3.1 INTRODUCCIÓN

Debes tener por seguro que ningún microcontrolador, por potente que sea, sirve para nada si no
tiene un programa o firmware que ejecutar. Un programa está compuesto de instrucciones. A su vez una
instrucción, representa la tarea mínima que el controlador entiende y es capaz de realizar. Un controlador
acepta un determinado número de instrucciones diferentes. Tu trabajo, como programador, consiste en
decirle al controlador qué instrucciones debe ejecutar, cuándo y cómo.

Por otra parte, no debes olvidar que un controlador es un dispositivo digital, que únicamente
entiende códigos binarios de unos y ceros. Cualquier instrucción de cualquier controlador se compone
siempre de un código binario que la codifica, identifica y diferencia del resto de instrucciones. Así pues un
programa no es ni más ni menos que una lista de códigos binarios guardados en la memoria FLASH de
programa, y que representan a las instrucciones a ejecutar. A esto se le conoce como “código máquina”.

Por fortuna, hoy en día nadie va a programar directamente en código máquina, tú tampoco. Como
mínimo vas a escribir los programas empleando las abreviaturas en inglés que representan a cada
instrucción. Estas abreviaturas reciben el nombre de “nemónicos”.

Existen herramientas o mecanismos que son


capaces de leer los nemónicos y/o símbolos que forman
el programa original, llamado “programa fuente”, y
convertirlo automáticamente en su equivalente binario,
al que se le llama “programa máquina o ejecutable”.
Estas herramientas reciben el nombre de
“ensambladores”.

Otras herramientas más evolucionadas y de


más alto nivel te permiten escribir el programa fuente de
una forma más humana, legible y sencilla. Reciben el
nombre de “compiladores” y su objetivo final es el mismo: obtener el programa ejecutable equivalente.
Quizá la figura te permita ver, o al menos intuir, la diferencia que hay entre programar mediante el lenguaje
ensamblador (arriba) o mediante un lenguaje de alto nivel (abajo).

Salta a la vista que la diferencia es notable. En ensamblador tenemos que escribir nuestro programa
o firmware detallando todas y cada una de las instrucciones elementales que el controlador debe ejecutar.
En un lenguaje de alto nivel escribimos los programas empleando expresiones fáciles y muy conocidas por
nosotros. El compilador se encarga de determinar a qué instrucciones elementales equivalen esas
expresiones. Sin embargo debes saber que el ensamblador normalmente es gratis, mientras que el
compilador, por desgracia, tiene un precio que, según su fiabilidad y prestaciones, puede ser bastante
elevado.

En este curso vas a estudiar MICROCONTROLADORES con mayúsculas. Esto implica que vas a
trabajar con sus auténticas instrucciones elementales. En mi humilde opinión es una buena manera de
empezar y de conocer todos los entresijos y posibilidades de un controlador. Ya tendrás tiempo de ir
mejorando la técnica de programación. Llegará un momento en que te interese utilizar otros lenguajes de
alto nivel, entonces sabrás valorar las diferencias.

El controlador PIC16F886 tiene un juego de 35 instrucciones elementales que te las debes de


aprender en su totalidad. Tranquilo, esto lo vamos a dejar para la siguiente unidad donde las verás en
profundidad. De momento, para que puedas empezar a realizar algunas prácticas, te basta con aprender 5
de esas instrucciones elementales. Con ellas será suficiente para que escribas los primeros programas, los
ensambles y simules su funcionamiento.

3-3
www.mkelectronica.com Microcontroladores PIC: Nivel I
T-3.2 INSTRUCCIONES BÁSICAS

En la próxima Unidad 4 vas a estudiar con detalle todo el juego de instrucciones que admiten los
controladores de la familia PIC16FXXX en general y el modelo PIC16F886 en particular. Sin embargo
vamos a adelantar un poco de trabajo. Te voy a presentar 5 de esas 35 instrucciones. Con ellas vas a poder
realizar tus primeros programas y ejercitarte en las técnicas de ensamblado y depuración.

Consistirán en sencillos ejemplos capaces de realizar diferentes


operaciones matemáticas. Observa la figura. La ALU (Arithmetic Logic Unit
ó Unidad Aritmético Lógica) es un circuito electrónico que integra el
controlador y que es capaz de realizar simples operaciones
aritmético/lógicas. Recibe dos operandos o datos (en azul) con los que
realizar la operación. Uno de esos operandos puede venir de diferentes
lugares a través de un circuito multiplexor (MUX). El otro operando viene
siempre del registro W.

El registro W es el único que NO se encuentra entre los registros especiales


(SFR) que hay en el área de memoria RAM de datos. En el mundo de los
controladores PIC se le conoce como “Work Register” o “Registro de
trabajo”, aunque en otros ambientes es muy conocido con el nombre de
“Acumulador”. Participa en todas las operaciones aritmético / lógicas. El resultado de la operación que
genera la ALU se puede guardar en el mismo registro W. El resultado de la ALU también puede modificar
tres bits del registro STATUS de estado (en amarillo). Indican si dicho resultado es cero o distinto de cero
(Z), o bien si hay o no llevada en los bits 4º (DC) y 8º (C) de la operación realizada.

T-3.2.1 Cargar el registro W (MOVLW)

Instrucción que permite cargar de forma inmediata cualquier valor en el registro W.

MOVLW Carga el W con la constante k


Sintaxis MOVLW k
Operando k es un valor inmediato de 8 bits entre 0 y 255
Operación k  (W)
Bits de estado Ninguno
Descripción Carga el registro W con el dato inmediato k
Ejemplo Antes de la instrucción: W=0xB7
Instrucción ejecutada: MOVLW 0x0F
Después de la instrucción: W=0x0F

T-3.2.2 Almacenar el registro W (MOVWF)

Guarda directamente el valor que hay en el registro W sobre la posición de memoria RAM del área
de datos que se indique.

MOVWF Guardar el W en el registro f


Sintaxis MOVWF f
Operando f es la dirección de un registro RAM entre 0 y 127
Operación (W)  (f)
Bits de estado Ninguno
Descripción Almacena el valor actual del registro W sobre la
dirección f
Ejemplo Antes de la instrucción: f(0x20)=0xB7
Instrucciones ejecutadas: MOVLW 0x33
MOVWF 0x20
Después de la instrucción: f(0x20)=0x33

3-4
www.mkelectronica.com Microcontroladores PIC: Nivel I
T-3.2.3 Sumar W (ADDLW)

Suma el valor actual que contiene el registro W con el valor que se indique en esta instrucción. Los
bits C, DC y Z del registro STATUS de estado se pueden ver modificados con el resultado de la operación.
Puede haber llevada en el 8º bit (C=1) o en el 4º bit (DC=1), o puede que no la haya. El resultado también
puede ser cero (Z=1) o distinto de cero (Z=0).

ADDLW Sumar W con la constante k


Sintaxis ADDLW k
Operando k es una valor inmediato de 8 bits entre 0 y 255
Operación (W) + k  (W)
Bits de estado C,DC,Z
Descripción Al contenido actual del registro W se le suma el dato
inmediato k. El resultado de la suma se deja en W.
C=0 si W < 255, C=1 si W > 255, DC =0 si W<3:0> <
15, DC =1 si W<3:0> > 15, Z=0 si W!=0 y Z=1 si W=0
Ejemplo Antes de la instrucción: W=0x03
Instrucción ejecutada: ADDLW 0x04
Después de la instrucción: W=0x07
C=0, DC=0 y Z=0

T-3.2.4 Restar W (SUBLW)

Resta, al valor que se indique en esta instrucción, el valor actual que contiene el registro W. Los bits
C, DC y Z del registro STATUS de estado se pueden ver modificados con el resultado de la operación.
Puede haber llevada en el 8º bit (C=0) o en el 4º bit (DC=0), o puede que no la haya. Los bits C y DC
operan de forma invertida cuando se ejecuta la instrucción de restar. El resultado también puede ser cero
(Z=1) o distinto de cero (Z=0).

SUBLW Restar a la constante k el registro W


Sintaxis SUBLW k
Operando k es una valor inmediato de 8 bits entre 0 y 255
Operación k – (W)  (W)
Bits de estado C,DC,Z
Descripción Al valor de la constante k se le resta el contenido del
registro W. El resultado de la resta se deja en W.
C=0 si W>k, C=1 si W≤k, DC=0 si W<3:0> > k<3:0>
y DC=1 si W<3:0>≤ k<3:0>, Z=1 si k = W
Ejemplo Antes de la instrucción: W=0x03
Instrucción ejecutada: SUBLW 0x07
Después de la instrucción: W=0x04
C=1, DC=1 y Z =0

T-3.2.5 Salto (GOTO)

Instrucción que desvía incondicionalmente la ejecución del programa saltando a una nueva
dirección de la memoria FLASH del área de programa. Realmente esta instrucción carga el contador de
programa (PC) con una nueva dirección desde la que se reanuda la ejecución.

GOTO Salto incondicional


Sintaxis GOTO k
Operando k es una valor de 11 bits entre 0 y 2047 que expresa
la dirección de salto
Operación k  PC<10:0>
(PCLATH<4:3>)  PC<12:11>
Bits de estado Ninguno

3-5
www.mkelectronica.com Microcontroladores PIC: Nivel I
Descripción Salto a la dirección k de la memoria de programa. El
valor k se copia en los 11 bits de menos peso del PC
(PC<10:0>) y el valor de los bits (PCLATH<4:3>)
sobre los bits (PC<12:11>. Se produce el salto.
Ejemplo Antes de la instrucción: PC=0x0005
Instrucción ejecutada: GOTO 0x1000
Después de la instrucción: PC=0x1000

T-3.2.6 Ahora tú

Si estás familiarizado con el sistema binario, no te será


muy difícil completar la siguiente tabla con los diferentes
resultados que se obtienen como consecuencia de realizar
diferentes operaciones entre dos valores de 8 bits, Dato A y Dato
B. En caso contrario quizá te puedas ayudar de una calculadora
científica o de la propia calculadora incluida en Windows que se
muestra en la figura.

Detalles que debes tener en cuenta:

1. Nuestro controlador es de 8 bits. El valor máximo de los datos con los que hacer la operación, así
8
como el resultado obtenido, es de 255 (2 -1).
2. Si trabajas con número con signo, los valores máximos de los datos con los que vas a operar, así
como el resultado, será de 0 a 127 y de -1 a -128 (en complemento a 2).
3. En la resta, los bits DC y C del registro STATUS de estado, operan de forma invertida con respecto
a la suma. Es decir, cuando están a nivel “1”, indican que NO hay llevada.
4. Con la instrucción Restar (SUBLW) se resta al valor indicado en la instrucción, el valor que en ese
momento hay en el registro W. Es decir, el contenido del registro W actúa como sustraendo.

Cargar Dato A INSTRUC- Dato B Resultado en W Z DC C


W BIN DEC CIÓN BIN DEC BIN DEC
MOVLW 00000101 ADDLW 00000011
MOVLW 00001001 ADDLW 00000111
MOVLW 01101001 ADDLW 01111000
MOVLW 10000101 ADDLW 10010110
MOVLW 11010010 ADDLW 00101110
MOVLW 00000011 SUBLW 00001001
MOVLW 01000110 SUBLW 01100111
MOVLW 01101001 SUBLW 01111000
MOVLW 00001001 SUBLW 00000111
MOVLW 00111000 SUBLW 00111000

3-6
www.mkelectronica.com Microcontroladores PIC: Nivel I
AREA DE PRÁCTICAS

P-3.1 INTRODUCCIÓN

Ya tienes los elementos mínimos necesarios para empezar a realizar tus primeros programas. Por
un lado, retomaremos el empleo de la plataforma de desarrollo MPLAB-IDE, desde donde escribirás tus
programas fuente de ejemplo, los ensamblarás y los depurarás. Inicialmente, vas a utilizar el simulador
MPLAB-SIM que integra el MPLAB-IDE. No vamos, por tanto, a emplear ni conectar ninguna herramienta
hardware. Ya lo harás más adelante. El empleo del simulador tiene dos importantes ventajas. Es gratis y no
necesitas nada más que el PC en donde lo tienes instalado. Dado su carácter didáctico podemos
experimentar, comprender y analizar el comportamiento de todas las instrucciones.

Por otro lado tendrás la oportunidad de emplear las técnicas y herramientas disponibles para la
depuración y puesta a punto de un programa. Aunque de momento trabajarás con el simulador, esas
técnicas serán las mismas que cuando emplees un depurador o un emulador profesional.

Recordarte que desde el material complementario que acompaña a esta Unidad, te puedes
descargar los programas fuente de todos los ejemplos propuestos, por lo que no te hará falta escribirlos. Yo
personalmente opino que es conveniente tomarse la molestia de escribir al menos un par de ellos, aunque
sólo sea para que te familiarices con el entorno de trabajo.

También te recomiendo
que esos programas fuente los
copies sobre una carpeta de tu
unidad de disco duro. Como en la
figura, cuando te descargues el
fichero comprimido con los
ejemplos correspondientes a esta
Unidad, “Ejemplos Unidad 3.zip”,
lo copias sobre una carpeta con el
mismo nombre, “Ejemplos Unidad
3”. Aquí lo descomprimes y
obtienes los programas fuente
disponibles (Ejemplo 3-1.asm,
Ejemplo 3-2.asm, etc…). En
adelante los podrás modificar a tu
antojo. Puedes proceder de la
misma manera con los ejemplos
del resto de Unidades.

Por último, procura leer despacio y prestar atención a los siguientes apartados donde se explicarán
las diferentes fases de trabajo que iremos aplicando a nuestro primer ejemplo. Serán similares en todos los
demás.

P-3.2 EDICIÓN DEL PRIMER PROGRAMA FUENTE: “Ejemplo 3-1.asm”

Vas a realizar tu primer programa fuente escrito en ensamblador y al que llamaremos “Ejemplo 3-
1.asm”. No se tratará más que de un fichero tipo texto. Ejecuta el programa MPLAB-IDE desde el menú
Inicio de Windows. Mediante el comando File  New se abre una ventana en blanco donde puedes
empezar a teclear un programa fuente. A partir de este momento puedes emplear todos los comandos de
edición incluidos en la opción Edit del menú principal del MPLAB-IDE. Mediante los comandos File  Save
o File  Save As guardas todo el trabajo de edición que hayas desarrollado hasta el momento. No te
olvides que los ficheros que contienen un programa fuente en ensamblador deben tener la extensión *.asm.

3-7
www.mkelectronica.com Microcontroladores PIC: Nivel I
Si, como ahora es el caso, vas a emplear los programas fuente que descargaste desde el material
complementario, puedes emplear el comando File  Open. Se abre el clásico navegador de Windows para
que selecciones la ruta y el fichero deseado: “D:\Ejemplos Unidad 3\Ejemplo 3-1.asm”.

En la figura tienes una ventana con el aspecto del programa fuente escrito en ensamblador. Se han
destacado varias secciones que describimos a continuación. Estúdialas con cuidado.

1. Área de cabeceras y comentarios. No es imprescindible, pero sí muy recomendable, que


todo programa fuente empiece con lo que se denomina un texto de “cabecera”. En él
puedes escribir información relativa al programa: nombre, autor, fecha, versión,
descripción y todo lo que se te ocurra. La única condición es que cada línea o renglón
empiece siempre por “;”. Esto mismo sirve para los comentarios que pueden acompañar
a una o varias instrucciones. Los comentarios ayudan, y mucho, a describir un programa
y hacerlo más comprensible en futuras revisiones. Merece la pena que te tomes la
molestia de escribirlos.

2. Se conocen como “directivas” a las tareas que el ensamblador es capaz de ejecutar


durante el ensamblado. NO son instrucciones del controlador PIC como tal. Un ejemplo
muy sencillo es la directiva “List p=16F886”. Le informa al ensamblador del modelo de
microcontrolador para el cual tiene que obtener el programa ejecutable. No olvides que el
ensamblador que suministra Microchip en el entorno MPLAB-IDE, es común para todos
los PIC’s de todas las familias. También debes saber que el ensamblador tiene un
considerable número de directivas. Nosotros emplearemos unas cuantas, las más
frecuentes.

En el material complementario de la Unidad 3 dispones de la guía completa del


ensamblador MPASM User’s Guide. Te puede servir de referencia con todas las
directivas disponibles.

3-8
www.mkelectronica.com Microcontroladores PIC: Nivel I
3. La directiva “equ” es una directiva de asignación. En este ejemplo, mediante la directiva
“Resultado equ 0x20”, asignamos a la dirección 0x20 del área RAM de datos la etiqueta
“Resultado”. Resulta muy cómodo asignar a las posiciones de memoria, etiquetas o
nombres que nos recuerden su función. Las asignamos al principio y luego las usamos
mediante su nombre y no mediante su dirección numérica que, probablemente, no nos
diga nada.

4. Otra directiva, la “org”. De alguna manera el


ensamblador tiene que saber en qué dirección de
la memoria empieza el programa. En el ejemplo, la
directiva “org 0x00”, le indica que nuestras
instrucciones comienzan a partir de la dirección
0x0000 de la memoria de programa.
“Casualmente” esta dirección se corresponde con
la del vector RESET y contiene la primera
instrucción que debe ejecutar el controlador.
Hemos puesto la instrucción “GOTO Inicio” que
traslada la ejecución a la dirección etiquetada
como “Inicio”. En un programa fuente se pueden
poner tantas directivas “org” como consideres
necesario. Te basta con saber que las instrucciones se van a ir almacenando a partir de
cada “org”. De esta manera, la siguiente directiva “org 0x05”, indica que nuestro
programa continúa en la dirección 0x05, donde se encuentra la etiqueta “Inicio”.
Realmente la instrucción “GOTO Inicio” se traducirá como “GOTO 0x05”. En la figura se
resume la clásica secuencia de RESET, donde además se reserva la dirección 0x04
correspondiente al vector de interrupción para cuando lo necesites.

5. Tienes aquí el cuerpo principal del programa. La instrucción “MOVLW .12” carga en el
registro W la constante .12 (0x0C). La instrucción “ADDLW .24” suma la constante .24
(0x18) al W, dejando aquí el resultado. Mediante “MOVWF Resultado” se guarda el
valor actual de W en la posición 0x20 del área de memoria RAM de datos. Recuerda que
a esta posición se le asignó previamente el nombre “Resultado”. Por último, la
instrucción “Fin GOTO Fin” produce un salto sobre sí misma creando así un bucle
infinito. El controlador se quedará en este estado hasta que se le aplique un RESET.

Un detalle. El ensamblador te permite expresar los valores numéricos en diferentes


bases de numeración: 0x0C (hex.) = .12 (decimal) = 0b00001100 (binario). Elige la que
mejor te venga.

6. Una última directiva, “end”. No es una instrucción por la cual el controlador detenga la
ejecución del programa. Es una directiva con la que indicamos al ensamblador el final de
nuestro programa fuente. Justo aquí termina el acto de ensamblar, acto por el cual el
programa fuente se convierte en un programa ejecutable.

7. Una recomendación. Durante la edición de un programa fuente procura que todo quede
debidamente tabulado en columnas. Todas las etiquetas, instrucciones, operandos y
comentarios que queden uno debajo del otro. Con esto facilitas su lectura.

P-3.3 CREANDO UN PROYECTO

Durante la actividad cotidiana de editar un programa fuente, ensamblarlo, depurarlo y, finalmente,


grabarlo, se genera una notable cantidad de ficheros con información sobre nuestro entorno de trabajo, tipo
de controlador, tipo de lenguaje, nombres del fichero fuente y su ejecutable, configuraciones, herramientas
de depuración, etc. Una buena idea sería aglutinar y organizar toda esa información como si de un único
fichero se tratara. Esto es un PROYECTO.

El empleo de proyectos te va a simplificar bastante el trabajo. Basta con definirlo y asignarle un


nombre. Él se encargará de todo lo demás. Cuando reanudes tu jornada de trabajo simplemente abres el
proyecto y te encontrarás con todo el sistema tal y como lo dejaste la última vez. Por otra parte, el MPLAB-
IDE dispone de un gestor de proyectos que te facilitará aún más la definición del mismo.

3-9
www.mkelectronica.com Microcontroladores PIC: Nivel I
P-3.3.1 Iniciando el gestor de proyectos

Basta con ejecutar el comando Project 


Wizard. Aparece una ventana de bienvenida como
la mostrada en la figura.

Se te invita a hacer click sobre el botón


“Siguiente” para continuar con la definición de
nuestro proyecto

P-3.3.2 Selección del dispositivo

Como puedes ver en la figura, el siguiente


paso consiste en seleccionar el modelo de PIC con
el que vas a trabajar. Obviamente éste es un paso
importante.

Basta con que abras el desplegable


“Device” para hacerte una idea de la gran cantidad
de controladores PIC disponibles. En nuestro caso
vas a buscar y seleccionar el PIC16F886. Termina
este paso pulsando el botón “Siguiente”.

P-3.3.3 Selección del lenguaje

Otro paso importante para definir un proyecto es establecer el lenguaje de programación que vamos
a emplear. Como se muestra en la figura vas a seleccionar el ensamblador MPASM que integra el propio
MPLAB-IDE de forma totalmente gratuita.

Si abres el desplegable “Active Toolsuite” verás que es posible trabajar con otros lenguajes como el
C de la firma CCS, el C de la firma Byte Craft, etc…
Son lo que se llaman “terceras fuentes”, que
fabrican lenguajes de programación que pueden
integrarse con el MPLAB según las
especificaciones de Microchip. Son comerciales y
por tanto tienen un precio (más bien elevado).

Cuando instalaste el MPLAB-IDE,


automáticamente se instaló todo lo necesario para
trabajar con el ensamblador (MPASM). Lo mismo
ocurre cuando se instala cualquier otro lenguaje de
los reconocidos por Microchip. En este caso, quizá
habría que hacer uso del botón “Browse” para
navegar y determinar la ubicación donde se
encuentra instalado dicho lenguaje. Pulsa el botón
“Siguiente”.

3-10
www.mkelectronica.com Microcontroladores PIC: Nivel I
P-3.3.4 Asignando un nombre al proyecto

Cómo no, otro paso esencial es determinar el nombre del proyecto y la carpeta donde lo vamos a
guardar. Recuerda que te sugerí que crearas una carpeta con el nombre “Ejemplos Unidad 3”. En ella
descargaste, desde el material complementario, el fichero comprimido “Ejemplos Unidad 3.zip”, lo
descomprimiste y obtuviste los dos ejemplos de
programas fuente: “Ejemplo 3-1.asm” y “Ejemplo 3-
2.asm”.

Puedes pulsar el botón “Browse” para


acceder al clásico cuadro de diálogos de Windows
que te permite navegar por las diferentes unidades
de almacenamiento de tu PC. Busca la carpeta
“Ejemplos Unidad 3” y asigna el nombre del
proyecto. Te recomiendo que al proyecto le asignes
el mismo nombre que el programa fuente, en este
caso: “Ejemplo 3-1”. Te tiene que quedar una
ventana parecida a la de la figura. Pulsa “Siguiente”
para continuar.

P-3.3.5 Asignando programas fuente al proyecto

Se trata de asociar a nuestro proyecto con


el programa fuente con el que debe trabajar. Mira la
figura. En el cuadro de la izquierda aparece la
carpeta en donde hemos ubicado nuestro proyecto
(“Ejemplos Unidad 3”) y todos los ficheros del tipo
“*.asm” o “*.inc” que contuviera. De momento
vamos a seleccionar “Ejemplo 3-1.asm” seguido de
un click en el botón “Add”. También basta con hacer
un doble click sobre el nombre del fichero deseado.
En cualquier caso ese fichero aparece sobre el
cuadro de la derecha. El proceso se repite con
tantos ficheros como se quieran asociar al mismo
proyecto. Terminada la selección pulsa el botón
“Siguiente”.

P-3.3.6 Finalizando la creación del proyecto

Cuando finalizas todos los pasos descritos


aparece una ventana como la de la figura. En ella
se muestra un breve resumen con la descripción de
tu proyecto:

Tipo de dispositivo: el PIC16F886


Lenguaje: Microchip MPASM
Fichero: D:\Ejemplos Unidad 3\Ejemplo 3-1.mcp

Terminamos pulsando el botón “Finalizar”.

3-11
www.mkelectronica.com Microcontroladores PIC: Nivel I
Una vez finalizada la descripción, verás una ventana con la estructura del
proyecto “Ejemplo 3-1.mcp”. En ella se muestra, organizados en carpetas, los
diferentes tipos de fichero asociados al proyecto., en nuestro caso el fichero fuente
“Ejemplo 3-1.asm”. Puedes hacer un doble clic sobre él. Se abre la ya conocida
ventana de edición donde puedes ver el programa fuente.

Recuerda que a partir de este momento todas las configuraciones, entorno


de trabajo, herramientas, ventanas, etc., quedan reunidas bajo el paraguas del
proyecto “Ejemplo 3-1.mcp”.

P-3.3.7 Comandos de la opción Project

En este momento tienes abierto el proyecto que acabas de


crear. Si seleccionas la opción Project del menú principal del
MPLAB-IDE, verás todos los comandos disponibles.

Tienes comandos para crear, abrir, seleccionar y cerrar


proyectos. Ensamblar o construir (“Build”) el programa
ejecutable, así como cambiar configuraciones y opciones del
ensamblador. El proyecto se puede (y debe) salvar. Se puede
renombrar, añadirle nuevos ficheros, eliminarlos, etc. También
puedes seleccionar un nuevo lenguaje de programación así
como su ubicación.

De todos ellos, el que más vas a utilizar será el comando “Make”


o el “Build All”, que permiten realizar el proceso de ensamblado.
Se pueden ejecutar también mediante las teclas rápidas F10 o
Ctrl + F10.

Es recomendable que periódicamente hagas uso del comando


Project  Save Project para salvaguardar el estado actual de
tu proyecto. Esto mismo se debe hacer siempre que finalices la
sesión de trabajo. En este caso, además, debes usar el
comando Project  Close para cerrar el proyecto con total
seguridad.

No tardarás en darte cuenta de lo importante y cómodo que resulta iniciar una sesión de trabajo al
día siguiente. Basta con ejecutar el comando Project  Open para que te encuentres con todo el entorno
tal y como lo habías dejado. Te aseguro que cuando estés trabajando en un proyecto de cierta envergadura,
configurar un entorno de trabajo que te resulte cómodo y familiar, es
bastante laborioso.

P-3.4 ENSAMBLAR

Consiste en traducir el programa fuente que has escrito


como si de un texto se tratara, en su equivalente en código objeto o
código máquina ejecutable. El ensamblador irá resolviendo las
etiquetas que hayas usado, y traduciendo las instrucciones a sus
correspondientes códigos binarios o códigos de operación.

Aunque es un proceso totalmente automático y transparente,


vamos a dar unas ligeras ideas de cómo se hace:

3-12
www.mkelectronica.com Microcontroladores PIC: Nivel I
1. El ensamblador se lee todo el programa fuente hasta llegar a la directiva “end”. Todos los
comentarios que empiezan por “;” no se tienen en cuenta. Las directivas sólo tienen efecto durante
el proceso de ensamblado.

2. Cada vez que encuentra una directiva de asignación de etiquetas, por ejemplo “Resultado equ
0x20”, el ensamblador anota su nombre y su valor. Cada vez que posteriormente encuentra esa
misma etiqueta a los largo del programa fuente, la sustituye por su valor asignado (0x20).

3. La directiva “org” inicia un contador interno que direcciona la memoria FLASH de programa. A partir
de esa dirección se van alojando secuencialmente todas las instrucciones. Pues bien, cuando se
encuentra una etiqueta asociada a una instrucción, como por ejemplo “Inicio MOVLW .12”, el
ensamblador conoce y registra el valor del contador en esa instrucción y lo asocia a la etiqueta. En
el ejemplo “Inicio” vale 0x05 y “Fin” vale 0x08. Cuando luego se encuentra con las instrucciones
“GOTO Inicio” o “Fin GOTO Fin”, las etiquetas se sustituyen por sus valores calculados: “GOTO
0x05” y “GOTO 0x08” respectivamente.

4. Por último, los nemónicos de las instrucciones empleadas en el programa, se van traduciendo a sus
equivalentes códigos binarios de operación. El ensamblador tiene una tabla interna que relaciona
cada nemónico con su código correspondiente.

Por otra parte debes saber que el ensamblador es


bastante “quisquilloso”. Cualquier discrepancia que no
sepa resolver, producirá un error de sintaxis. Esto te
obliga a acudir al programa fuente para editarlo y corregir
todos los errores que se hubieran generado, y volver a
ensamblarlo. Te doy algunas recomendaciones:

 Las etiquetas se deben usar tal y como fueron definidas, diferenciando mayúsculas de minúsculas.
No es lo mismo “Inicio” que “inicio”.

 Deben empezar mediante un carácter alfabético no numérico. “Inicio3” está bien. “3Inicio” está mal.

 No se deben dejar espacios en blanco. “Una_Prueba” está bien, “Una Prueba” está mal.

 El nombre de una etiqueta no puede coincidir con el nemónico de una instrucción ni con una
directiva del ensamblador.

 El uso de las etiquetas ayudan a comprender un programa. Su nombre puede estar compuesto de
hasta 256 caracteres, pero te aconsejo que emplees nombres breves, concisos y que te recuerden
el tipo de información al que hacen referencia.

 Los nemónicos los puedes escribir con mayúsculas, minúsculas o una mezcla de ambas. Te
recomiendo que uses sólo mayúsculas o sólo minúsculas. Evitarás errores.

 Procurar documentar, mediante comentarios, todos tus programas. Lo agradecerás más adelante si
los tienes que revisar, modificar, actualizar, etc…

 No olvides nunca poner “;” delante de cualquier comentario. De no hacerlo, el ensamblador te


puede generar cientos o miles de errores.

3-13
www.mkelectronica.com Microcontroladores PIC: Nivel I
P-3.4.1 Iniciando el ensamblado

Basta con ejecutar el comando Project 


Make o bien pulsar F10. Es un proceso totalmente
automático que dura muy pocos segundos. Se abre
la ventana Output de salida. Si todo va bien,
aparecerá el mensaje “BUILD SUCCEEDED”.
Sabrás así que el programa ejecutable o máquina
se ha generado correctamente.

Si hay algún tipo de error lo verás en esa


ventana. Te informa del tipo de error (consulta el
manual original del MPASM) y en qué línea del
programa fuente se encuentra. Basta con hacer un
doble clic sobre cada mensaje de error para que te
lleve al editor del programa fuente, justo a la línea
donde se encuentra ese error.

Ahora es el momento de que curiosees qué es lo que has obtenido tras el ensamblado. Para ello
puedes ver la memoria de programa mediante el comando View  Program Memory. Su contenido se
puede representar en código hexadecimal, con nemónicos o en forma simbólica, según la pestaña o ficha
que selecciones. ¡Seguro que ves la relación que hay entre ellas y el programa fuente original!

De todas formas insistir una vez más que, lo que realmente se grabará en la memoria FLASH de
programa del controlador, son los códigos binarios o hexadecimales tal y como se muestran con la pestalla
“Opcode Hex”.

3-14
www.mkelectronica.com Microcontroladores PIC: Nivel I
También puede ser un buen momento para que explores tu carpeta de trabajo “Ejemplos Unidad 3”.
Verás la cantidad de ficheros que se han generado como consecuencia de crear y ensamblar un proyecto
partiendo del programa fuente “Ejemplo 3-1.asm”. Todos los ficheros tienen el mismo nombre “Ejemplo 3-1”,
pero con extensiones diferentes.

Algunos de esos ficheros son de información interna del propio MPLAB-IDE. Otros, los que más
interés pueden tener para ti, podrían ser los siguientes:

FICHERO DESCRIPCIÓN
Ejemplo 3-1.asm Es el fichero original, en el que has escrito el programa fuente
en ensamblador (o en lenguaje C de alto nivel)
Ejemplo 3-1.mcp Contiene la definición del proyecto con configuraciones,
selecciones, ajustes, etc. Aglutina a todos los demás
Contiene el entorno de trabajo del proyecto actual. Básicamente
Ejemplo 3-1.mcw define las ventanas que están abiertas, su tamaño y su
ubicación.
Ejemplo 3-1.hex Es el fichero ejecutable resultante del ensamblado/compilado y
que emplearás en la grabación del PIC
Ejemplo 3-1.err Es un fichero imprimible que contiene una relación de todos los
errores que se hayan producido durante el ensamblado
Ejemplo 3-1.lst Es un fichero imprimible que contiene el listado de todos los
pasos dados por el ensamblador para obtener el ejecutable
Fichero imprimible con la relación de todas las etiquetas
Ejemplo 3-1.map empleadas y sus valores asociados. También presenta una
relación de las zonas ocupadas en la memoria de programa del
controlador

De todos ellos, el más importante es “Ejemplo 3-1.hex”. Contiene toda la información que hay que
grabar físicamente en las diferentes regiones de memoria del controlador: memoria de programa, memoria
EEPROM de datos, palabra de configuración y palabra ID de identificación. Es un fichero con un formato
estándar admitido por todos los equipos comerciales de grabación.

3-15
www.mkelectronica.com Microcontroladores PIC: Nivel I
Una advertencia. Cuando ensambles un programa fuente, y no te genere errores, no te hagas
demasiadas ilusiones. Simplemente quiere decir que el programa está bien escrito, pero no que vaya a
funcionar ni mucho menos. El ensamblador sólo detecta errores de tipo sintáctico en la escritura del
programa, pero no detecta errores conceptuales. Quiero decir que, si escribes un programa con la intención
de hacer la suma de dos números pero te equivocas de instrucción y pones la de restar, bajo el punto de
vista del ensamblador todo está bien, pero el
resultado no es el que esperabas.
Personalmente no recuerdo ningún programa
que, ensamblado correctamente, haya
funcionado a la primera.

Hasta que no lo ejecutes no podrás


saber si el funcionamiento es o no correcto.
Aquí es donde entran las herramientas de
simulación o depuración de las que
hablaremos a continuación. En la figura
tienes un esquema básico de trabajo.
Resume los pasos que debes seguir hasta
que un programa te funcione correctamente.

1. El primer paso ya lo has hecho. Consiste en editar el programa fuente y ensamblarlo. No


ha sido el caso, pero si hubiera habido errores, el ensamblador te diría de qué tipo y en
dónde se encuentran. Vuelves entonces al editor, localizas y corriges los errores y
vuelves a repetir el proceso de ensamblado.

2. Este paso es el que vamos a realizar a continuación. Consiste en emplear las


herramientas que dispongas para depurar, poner a punto y verificar el correcto
funcionamiento del programa. De momento vas a emplear el simulador propio de
MPLAB-IDE. En el futuro inmediato emplearás el depurador que integra el laboratorio de
prácticas USB-PIC’School. Estas herramientas te ayudarán a localizar los fallos del
programa. Corregir estos fallos exige volver a repetir el paso 1: editarlos y ensamblar. No
terminarás con el paso 2 hasta que tengas la absoluta certeza de que el programa
funciona correctamente.

3. El último paso sería grabar el PIC con el programa ejecutable *.HEX recién obtenido.
Ese PIC lo insertarás en el correspondiente hardware de la aplicación donde harás las
pruebas finales y definitivas.

P-3.5 DEPURACIÓN

Es aquí donde probablemente tengas que invertir la mayor parte del tiempo de diseño. Hay que
verificar que el programa funciona al 100% y, por desgracia, los programas tienen la mala costumbre de no
hacerlo a la primera. Los programas que se adjuntan en el material complementario del curso funcionan
correctamente. Han sido debidamente comprobados. Sin embargo, es posible que te apetezca modificarlos,
mejorarlos o adaptarlos a tus necesidades. Te animo a que así lo hagas.

Por fortuna, dispones de una serie de herramientas que te ayudarán a localizar los fallos. De
momento, vas a utilizar el simulador que incorpora el MPLAB-IDE. Todos los comandos y técnicas que aquí
aprendas, te servirán más adelante cuando uses otras herramientas más profesionales como los
depuradores o emuladores.

P-3.5.1 Preparando el entorno de trabajo

Como la depuración y puesta a punto de un programa exige de un notable esfuerzo y paciencia, lo


mejor es que te pongas cómodo y te crees un ambiente de trabajo de acuerdo a las necesidades de cada
caso. Te sugiero el siguiente entorno para depurar este sencillo primer ejemplo. Vamos a crearlo poco a
poco.

3-16
www.mkelectronica.com Microcontroladores PIC: Nivel I
3-17
www.mkelectronica.com Microcontroladores PIC: Nivel I
Se han abierto una serie de ventanas que iremos detallando. De momento recuerda que esto
formará parte del proyecto “Ejemplo 3-1.mcp” y debes tener la precaución de guardarlo periódicamente con
Project  Save Project o bien de cerrarlo con Project  Close.

P-3.5.1.1 Botones de depuración

Esta barra de botones aparece cuando se selecciona cualquiera de las herramientas de depuración.
De momento vas a usar el simulador. Lo puedes activar mediante Debugger  Select Tool  MPLAB
SIM. Con ellos, de izquierda a derecha, puedes…

 Ejecutar un programa en tiempo real


 Detener la ejecución
 Ejecutar con animación
 Ejecutar paso a paso, instrucción a instrucción
 Ejecutar un bloque de instrucciones (subrutina)
 Finalizar la ejecución de un bloque de instrucciones (subrutina)
 Provocar un RESET en el PIC (simular)
 Establecer puntos de parada o breakpoints

P-3.5.1.2 La ventana Stopwatch

Se abre mediante el comando Debugger  Stopwatch. En el


modo de simulación te puede resultar muy útil, ya que te
informa del número de ciclos transcurridos según se van
ejecutando las instrucciones. Esto, al fin y al cabo, se
traducirá en el tiempo que tarda en ejecutarse un determinado
programa. Mediante el botón “Zero” se inicia la medida de
tiempo en cualquier momento. Con el comando Debugger 
Settings abres una ventana como la mostrada en la figura.
Permite ajustar diferentes parámetros de la simulación. Entre
ellos se encuentra, en la ficha Osc/Trace, la frecuencia del
controlador con la que se hará la simulación y que sirve como
referencia. Vas a seleccionar 4MHz.

P-3.5.1.3 La ventana del programa fuente

El contenido de esta ventana ya lo conoces. Contiene el programa fuente tal y como lo escribiste en
la fase de edición.

P-3.5.1.4 La ventana Output

Esta ventana también te resultará familiar. Cada vez que se ensambla el programa fuente mediante
Project  Make o la tecla F10, muestra los errores que se hubieran producido. Se deben corregir hasta que
finalmente nos aparezca el mensaje “BUILD SUCCEEDED”.

P-2.5.1.5 La ventana File Registers

Se abre mediante View  File Registers y muestra el contenido de todos los registros del área
RAM de datos, tanto los especiales (SFR), como los que dispone el usuario para sus datos y variables.
Según la pestaña que selecciones, el contenido se puede visualizar en hexadecimal o en forma de
símbolos. En este caso se visualiza el nombre o etiqueta de aquellas direcciones que hayas definido en el
programa fuente (p.e. “Resultado equ 0x20”). ¡¡ Pruébalo !! Dicho contenido también se puede modificar. Al
fin y al cabo se tratan de registros de tipo RAM. Basta con seleccionar cualquiera de ellos y asignarle un
nuevo valor. Con las teclas cursoras y/o de tabulación podemos ir seleccionando registros contiguos.

3-18
www.mkelectronica.com Microcontroladores PIC: Nivel I
Durante la simulación o depuración suele ser muy frecuente introducir valores en los registros para
ver cómo reaccionan las instrucciones y operan con ellos. Estás en el modo de simulación. Puedes probar a
introducir valores en diferentes posiciones.

P-3.5.1.6 La ventana Watch

Se abre mediante el comando View  Watch y también sirve para visualizar y modificar los
registros RAM del área de datos del controlador. La diferencia con la anterior es que en este caso sólo se
visualizan los registros que indiques. Aconsejo que la tengas siempre abierta ya que te brinda la posibilidad,
no sólo de ver lo que te interesa, también puedes agrupar los registros en cuatro fichas Watch 1...Watch 4.
Por ejemplo, en Watch 1 puedes visualizar los registros especiales (SFR) que vayas a usar, en Watch 2 tus
variables, etc…

Tiene dos desplegables que te permiten añadir a la lista los registros SFR (“Add SFR”) y los
símbolos o etiquetas (“Add Symbol”) que hayas definido en tu programa fuente una vez ensamblado. Basta
con abrir un desplegable y seleccionar cualquiera de ellos. En la figura que mostraba mi entorno de trabajo
se visualizan los siguientes registros especiales: PCL (los 8 bits de menos peso del PC), el registro
STATUS de estado y el WREG (registro de trabajo o acumulador). Como registros o variables del usuario se
visualiza el registro “Resultado” que se definió en el programa fuente.

Esta ventana también posibilita elegir el sistema de numeración con el que quieres que se visualice
el contenido de esos registros. Basta con seleccionar cualquiera de ellos y hacer clic con el botón derecho.
De entre las opciones disponibles selecciona “Properties”. Se abre
una nueva ventana como la de la figura.

En ella seleccionas el símbolo o etiqueta (“Symbol”), el


tamaño de la misma (“Size”) y el formato (“Format”). En este último
puedes seleccionar entre: hexadecimal, decimal, binario, ASCII,
etc… Dependiendo del significado, contexto o contenido de un
registro te puede interesar visualizarlo en uno o en otro formato. En
el ejemplo, el registro PCL se visualiza en hexadecimal, STATUS en
binario y tanto REG como la variable “Resultado” se visualizan en
decimal.

Ni qué decir tiene que mediante la ventana Watch también


puedes introducir valores a cualquiera de sus registros. Basta con
seleccionarlo y asignarle el nuevo valor y analizar así cómo
repercuten esos nuevos valores en el curso de la ejecución.

P-3.5.1.7 Desactivar el WDT

Ya hablaremos sobre él y lo podrás usar más adelante. De momento nos molesta, así que lo vas a
desactivar. Para ello ejecuta el comando Configure  Configuration Bits que nos muestra la siguiente
ventana. En primer lugar desactiva, si lo estuviera, la casilla “Configuration Bits set in code”. A continuación
elige el campo WDTE y selecciona la opción WDT Disabled. Cierra la ventana.

3-19
www.mkelectronica.com Microcontroladores PIC: Nivel I
P-3.5.2 Ejecución paso a paso

La ejecución paso a paso consiste en ir ejecutando de una en una, y cuando tú lo indiques, las
instrucciones de un programa. Tienes la oportunidad de analizar los resultados y consecuencias que
implica la ejecución de cada una de ellas. Esto puede llegar a ser muy tedioso si el programa es muy
complejo, sin embargo es la técnica más fiable y segura para localizar fallos.

Quizá sea el momento de tomarte un respiro antes de empezar con este apartado. Si lo consideras
oportuno déjalo para otra ocasión. Necesitas prestar la máxima atención y seguir todos los pasos que
vamos a numerar. No queda otra, sin embargo al final verás la luz e intuirás la importancia que tiene esta
técnica de cara a la puesta a punto de tus futuros proyectos y
programas.

1. Pulsa el botón Reset. En la ventana del programa fuente


aparece una flecha verde que apunta a la instrucción que toca
ejecutar, “goto Inicio”. En la ventana Stopwatch los contadores
se ponen a 0. Has simulado un RESET en el controlador.

2. Ahora vas a ejecutar una instrucción y solo una. Pulsa el botón Step Into. Has
ejecutado la instrucción “goto Inicio”.

3. La flecha verde apunta ahora a la siguiente instrucción que toca ejecutar, “Inicio movlw .12”. Se ha
ejecutado el salto de la instrucción anterior.

4. Observa y completa. El registro PCL vale ___________, que es la dirección donde se encuentra la
instrucción ____________________ que toca ejecutar.

5. Según la ventana Stopwatch busca y anota el valor de Instruction Cycles = _____________ y el


valor de Time = _____________. Representa el tiempo que tardó en ejecutarse la instrucción
____________________. ¿Cuánto ? __________________________________

6. Pulsa nuevamente el botón Step Into para ejecutar la instrucción “mowlw .12”. La flecha verde en la
ventana del programa fuente apunta a la siguiente instrucción.

7. Anota los valores del PCL = _________________, WREG = ________________

8. Anota los valores de Instruction Cycles = ___________________ y Time = _________________.


¿Cuánto tardó en ejecutarse la instrucción _________________________ ?

9. Pulsa nuevamente el botón Step Into para ejecutar la instrucción “addlw .24”. La flecha verde en la
ventana del programa fuente apunta a la siguiente instrucción.

10. Anota los valores del PCL = ______________, WREG = _____________ y STATUS =__________.
Indica el estado de los bits Z=_______, DC=_______ y C=________

11. Anota los valores de Instruction Cycles = ___________________ y Time = _________________.


¿Cuánto tardó en ejecutarse la instrucción _________________________ ?

12. Pulsa nuevamente el botón Step Into para ejecutar la instrucción “movwf Resultado”. La flecha
verde en la ventana del programa fuente apunta a la siguiente instrucción.

13. Anota los valores del PCL = _____________, WREG = ____________ y Resultado =__________.
Indica el estado de los bits Z=_______, DC=_______ y C=________

3-20
www.mkelectronica.com Microcontroladores PIC: Nivel I
14. Anota los valores de Instruction Cycles = ___________________ y Time = _________________.
¿Cuánto tardó en ejecutarse la instrucción _________________________ ?

15. Pulsa nuevamente el botón Step Into para ejecutar la instrucción “Fin goto Fin”. La flecha verde en
la ventana del programa fuente apunta a la siguiente instrucción. ¿Cuál es esta? _______________

16. Anota los valores de Instruction Cycles = ___________________ y Time = _________________.


¿Cuánto tardó en ejecutarse la instrucción _________________________ ?

17. Pulsa nuevamente el botón Step Into para ejecutar la instrucción “Fin goto Fin”. La flecha verde en
la ventana del programa fuente apunta a la siguiente instrucción. ¿Cuál es esta? _______________

18. Anota los valores de Instruction Cycles = ___________________ y Time = _________________.


¿Cuánto tardó en ejecutarse la instrucción _________________________ ?

19. Puedes repetir los pasos 17 y 18 todas las veces que quieras. ¿Qué valores son los únicos que
cambian? ____________________________________________________________ ¿Porqué?
________________________________________________________________________________
________________________________________________________________________________
_______________________________________________________________________________

Fíjate en el desarrollo que has realizado para un programa de tan sólo 5 instrucciones. Si has hecho
un cuidadoso seguimiento, estarás de acuerdo en que la ejecución paso a paso te permite analizar la
evolución de todas las instrucciones del programa. Manejando con habilidad esta técnica no hay fallo que
no puedas localizar.

Ahora tú

Te voy a pedir que modifiques el programa fuente pues ahora se trata de sumar .198 + .120 (en hex
0xC6 + 0x78). Aunque se trata del mismo proyecto, debes volverlo a ensamblar y depurar, simulándolo
mediante la técnica del paso a paso que acabas de emplear. Repasa los apartados T-3.4.1 y T-3.5.2.
Completa la siguiente tabla.

INSTRUCCION PCL Z DC C WREG Resultado Ciclos Time


RESET
goto Inicio
Inicio movlw .198
addlw .120
movwf Resultado
Fin goto Fin
Fin goto Fin

Vuelve a repetir el ejercicio pero sumando .49 + .207 (en hex 0x31 + 0xCF) y completando de nuevo
la tabla.

INSTRUCCION PCL Z DC C WREG Resultado Ciclos Time


RESET
goto Inicio
Inicio movlw .49
addlw .207
movwf Resultado
Fin goto Fin
Fin goto Fin

Fíjate bien en los bits Z, DC y C del registro STATUS. Su valor depende del resultado de las
diferentes sumas. Repasa esta instrucción (ADDLW) en el apartado T-3.2.3.

3-21
www.mkelectronica.com Microcontroladores PIC: Nivel I
T.3.5.3 Ejecución con punto de parada

Es otra técnica que te permitirá ahorrar tiempo de depuración. Imagina la siguiente situación. Tienes
un programa compuesto de varias instrucciones. Algunas de ellas ya sabes que funcionan correctamente, el
resto son las que tienes que analizar. ¿Hay que ejecutarlas también paso a paso hasta llegar a las que nos
interesan? Si así fuera la depuración podría ser eterna. La respuesta es NO si sabes emplear técnica.

Un punto de parada o “Breakpoint”, te brinda la posibilidad de ejecutar un trozo de programa en


tiempo real y detenerse al llegar a un determinado punto de parada. Estos puntos se pueden establecer de
diferentes tipos y condiciones en función de la herramienta de depuración que tengas. Vamos a emplear
breakpoints basados en direcciones, que son los más sencillos y comunes, y los soportan todas las
herramientas.

Un breakpoint basado en direcciones, no es otra cosa que poder decirle al sistema que, cuando el
PC llegue a una determinada dirección del programa, detenga la ejecución. El simulador MPSIM que estás
usando de momento, te permite implementar un número
indefinido de breakpoints. Un emulador profesional como
mel MPLAB-REAL ICE admite múltiples breakpoints, de
diferentes tipos y condiciones. El depurador que integra el
laboratorio USB-PIC’School que emplearás más adelante,
sólo admite establecer un breakpoint. Es más que suficiente
en la mayor parte de ocasiones.

El botón Breakpoints, a la derecha de la barra de


botones de ejecución, abre una ventana como la de la
figura. En el campo “Break at” vamos indicando los
números de renglón del programa fuente en que queremos
establecer las distintas direcciones de parada.

En el cuadro “Program Memory Breakpoints” vamos


creando una lista de puntos de parada. Mediante los
botones de la derecha podemos habilitarlos o no, así como
borrarlos. Una vez confeccionada esa lista de puntos,
pulsamos OK.

Otra forma, mucho más cómoda, de establecer


breakpoints consiste en hacer un doble clic en
aquella línea del programa fuente donde quieras
detener la ejecución. Lo mismo debes hacer para
eliminar un breakpoint. Eso sí, la línea
seleccionada debe contener una instrucción
válida del PIC. Todo renglón al que se le ha
asociado un breakpoint queda marcado con un
círculo rojo a su izquierda. Observa por un
momento la figura.

Con hacer un doble clic sobre la línea del programa fuente que contiene la instrucción “movwf
Resultado”, establecemos un punto de parada y queda marcada mediante el círculo rojo. Esto se puede
interpretar como que el sistema va a ejecutar en tiempo real todas las instrucciones que hay desde donde
se encuentre en ese momento el PC (flecha verde) hasta el breakpoint (círculo rojo). Vamos a probarlo:

1. Pulsa RESET para empezar desde el principio. La flecha verde se coloca en la primera
instrucción “goto Inicio”.

3-22
www.mkelectronica.com Microcontroladores PIC: Nivel I
2. Pon a 0 todos los registros de la ventana “Watch” ya que igual contienen datos
resultantes de los ejercicios anteriores .

3. Pulsa el botón RUN de ejecución en tiempo real. Verás que la flecha


verde se sitúa justo encima del círculo rojo.

4. La ejecución se ha detenido. Puedes comprobar que las instrucciones ejecutadas han


generado el resultado esperado hasta el momento (Cargar .12 y sumar .24).

5. A partir de este momento puedes seguir ejecutando paso a paso como lo hiciste
anteriormente, o bien poner otro breakpoint y seguir ejecutando en tiempo real.

Seguro que eres capaz de intuir la importancia del adecuado uso de los breakpoints. Manejados con
habilidad ahorrarás mucho tiempo de depuración. Podrás ejecutar trozos de programa en tiempo real, sin
tener que ejecutar paso a paso cada una de las instrucciones que los componen.

P-3.5.4 Ejecución en tiempo real

Es tal y como el controlador ejecutaría el programa. Para ello es necesario que el programa
funcione correctamente. Consiste en ejecutar todas las instrucciones del programa hasta que lo
detengamos. Claro está que, si hubiera alguna instrucción incorrecta, NO sabrás en dónde se encuentra ni
porqué falla. En el caso que nos ocupa ya sabes que el “Ejemplo 3-1.asm” funciona correctamente. Para
eso lo ejecutaste paso a paso y con breakpoints en los apartados anteriores. Ahora vas a ejecutarlo en
tiempo real siguiendo los siguientes pasos:

1. Asegúrate de que los registros WREG y “Resultado”, se encuentran por ejemplo a 0. Si


no lo estuvieran ya, los pones, para que no haya “trampas”.

2. Pulsa el botón RESET en la barra de botones de herramientas. Observa que por


ejemplo, el registro PCL se pone a 0, ya que el vector de RESET con el que se carga el
PC se encuentra en la dirección 0x0000. También que, en la ventana del programa
fuente, en la margen izquierda, aparece la flecha verde que representa la instrucción que
toca ejecutar (“goto Inicio”). Los contadores de la ventana “Stopwatch” también se ponen
a 0.

3. Pulsa el botón RUN. Comienza la ejecución. Nuestro


programa se ha ejecutado en un suspiro. Si recuerdas, la
última instrucción era “Fin goto Fin”. El PIC está dando
vueltas eternamente sobre esa instrucción. En la parte
inferior izquierda de la pantalla puedes una barra de
evolución, “Runing..”, que está en constante movimiento.

4. Para detener la ejecución pulsa el botón HALT.

5. Analiza lo ocurrido. En primer lugar la variable o registro “Resultado” se ha cargado con


el valor .36. Este mismo resultado aparece en hexadecimal (0x24) en la posición 0x20
(“Resultado”) de la ventana “File Registers”.

3-23
www.mkelectronica.com Microcontroladores PIC: Nivel I
6. Si miras el registro STATUS verás que su bit de la derecha, el que representa al Carry
(llevada), está a “0”. Esto es porque la última instrucción ejecutada, “addlw 24” no genera
llevada.

7. Otros detalles de relevancia. El PCL se ha cargado con 0x08 que es la dirección en que
se quedó al detener la ejecución mediante el botón Halt. Como no podía ser de otra
manera, corresponde a la instrucción “Fin goto Fin”. La flecha verde también apunta a
esa misma instrucción en la ventana del programa fuente. Por último, la ventana
“Stopwatch”, refleja el número de ciclos ejecutados y el correspondiente tiempo
consumido partiendo de una velocidad de trabajo de 4 MHz.

Se supone que la ventana “Stopwatch” mide el tiempo transcurrido entre las pulsaciones del botón
RUN y el botón HALT. No te molestes en cronometrarlo, seguramente no coincidirá nunca. Ten en cuenta
que estamos hablando de un simulador gracias al cual el PC se comporta como lo haría un PIC, pero no es
un PIC, así que lo que llamamos “Tiempo real”, sería mejor llamarlo “Tiempo real simulado”. Podemos tener
un PC muy lento o muy rápido, pero siempre marcaría el mismo número de ciclos y de tiempo consumido.

P-3.5.5 Ejecución con animación

No es un tipo de ejecución que vayas a emplear demasiado. Es similar a la anterior con la diferencia
de que las distintas ventanas que estuvieran abiertas se van actualizando dinámicamente conforme se va
ejecutando cada instrucción. Si tienes buena vista y tu PC es muy lento quizá puedas apreciar esas
actualizaciones. De todas formas lo puedes intentar:

1. Nuevamente asegúrate de que los registros WREG y “Resultado”, se encuentren a 0.

2. Pulsa el botón RESET. La flecha verde apunta a la primera instrucción y los contadores
de la ventana “Stopwatch” también se ponen a 0.

3. Pulsa el botón ANIMATE (el tercero por la izquierda). Comienza la ejecución y verás, si
eres rápido, cómo se van actualizando las distintas ventanas.

4. Para detener la ejecución pulsas el botón HALT.

5. Analiza los mismos detalles que en la ejecución anterior mediante RUN.

P-3.5.6 Ejecución de funciones o subrutinas

Mediante STEP OVER puedes ejecutar en tiempo real y, sin entrar en ella, todas las instrucciones
contenidas en una función o subrutina. Con STEP OUT puedes salir de una función o subrutina, suponiendo
que estés dentro de ella, ejecutando todas las instrucciones hasta el final de la misma.

De momento ni sabes lo que es una función (o subrutina) ni tienes


ningún ejemplo. Simplemente basta con decir que es un conjunto de
instrucciones que realizan una determinada tarea. Ya las usarás más adelante.

P-3.6 TRABAJO PERSONAL

Es el momento de que desarrolles por tu cuenta todo lo que se ha explicado en el área de prácticas
de esta Unidad 3. Se trata de que hagas un nuevo proyecto basándote en el programa fuente “Ejemplo 3-
2.asm”. Vete haciéndolo en orden repasando los diferentes apartados.

1. Mediante el editor echa un vistazo al programa fuente “Ejemplo 3-2.asm”, según se explica en el
apartado P-3-2. Se trata de un programa muy parecido al del “Ejemplo 3-1.asm”. En lugar de hacer
una suma, realiza la resta de dos números, 45 – 23.

3-24
www.mkelectronica.com Microcontroladores PIC: Nivel I
2. Crea un nuevo proyecto tal y como se explica en el apartado P-3.3. Utiliza el asistente. Es
recomendable que el nombre que asignes al proyecto sea el mismo que el nombre del fichero que
contiene el programa fuente. En este caso tu nuevo proyecto debiera llamarse “Ejemplo 3-2.mcp”.

3. Como se explica en el apartado P-3.4 procede a ensamblar el programa.

4. Prepara tu entorno de trabajo de forma similar a como lo hiciste en el apartado P-3.5.1. Con
Debugger  Select Tool selecciona el simulador MPLAB SIM como herramienta de simulación.
Abre, dimensiona y coloca las siguientes ventanas: Stopwatch, programa fuente, Output, File
Registers y Watch. No te olvides de desactivar el WDT (apartado P-3.5.1.7). Tampoco te olvides de
salvar este nuevo proyecto mediante Project  Save Project.

5. Una vez que has definido el proyecto en base al programa fuente “Ejemplo 3-2.asm”, ensamblado y
establecido tu entorno de trabajo, ya puedes comenzar con la simulación. Empieza con la ejecución
paso a paso según se explicó en el apartado P-3.5.2. Luego, si te parece puedes utilizar los
breakpoints, ejecución en tiempo real, etc…

6. Completa la siguiente tabla con los resultados obtenidos:

INSTRUCCION PCL Z DC C WREG Resultado Ciclos Time


RESET
goto Inicio
Inicio movlw .23
sublw .45
movwf Resultado
Fin goto Fin
Fin goto Fin

7. Cambia los valores. El sustraendo pasa a ser .85 (en hex 0x55) en lugar de .23, el minuendo es
ahora .67 (en hex 0x43) en lugar de .45. Vas a restar .67 - .85 (0x43 – 0x55). Completa nuevamente
la tabla, y razona los resultados.

INSTRUCCION PCL Z DC C WREG Resultado Ciclos Time


RESET
goto Inicio
Inicio movlw .85
sublw .67
movwf Resultado
Fin goto Fin
Fin goto Fin

8. Vuelve a cambiar los valores. Ahora restarás .112 - .112 (0x70 – 0x70). Completa la tabla y razona
los resultados

INSTRUCCION PCL Z DC C WREG Resultado Ciclos Time


RESET
goto Inicio
Inicio movlw .112
sublw .112
movwf Resultado
Fin goto Fin
Fin goto Fin

9. Ahora vas a desarrollar tú mismo un nuevo programa de ejemplo, el “Ejemplo 3-3.asm”. Se trata de
que realice el siguiente cálculo: .210 – (.34 +.26). En hexadecimal sería 0xD2 – (0x22 + 0x1A). Crea

3-25
www.mkelectronica.com Microcontroladores PIC: Nivel I
un nuevo proyecto, el “Ejemplo 3-3.mcp”, lo ensamblas y lo simulas. Como con los anteriores
ejemplos, completa la siguiente tabla.

INSTRUCCION PCL Z DC C WREG Resultado Ciclos Time


RESET
goto Inicio
Inicio movlw .34
addlw .26
sublw .210
movwf Resultado
Fin goto Fin
Fin goto Fin

En el material complementario dispones de tre vídeos: “Creando un proyecto” “Ensamblado” y


“Simulación”. En ellos se resumen todos los pasos realizados con el “Ejemplo 3-1”. Échales un
vistazo.

3-26
www.mkelectronica.com Microcontroladores PIC: Nivel I
UNIDAD 4: LAS INSTRUCCIONES DEL PIC16F8XXX

OBJETIVOS

Ya va siendo hora de estudiar en profundidad el juego completo de instrucciones y los diferentes


modos de direccionamiento que soportan la familia de microcontroladores PIC16FXXX, entre los que se
encuentra el modelo PIC16F886 con el que estás trabajar. ¡¡ Ármate de valor porque se trata de una
unidad muy extensa e importante !!

En el área de teoría de la Unidad 3 anterior se vieron 5 instrucciones de un total de 35. Gracias a


ellas pudiste realizar tus primeros programas de ejemplo. Ahora es el momento de estudiar a todas las
restantes, así como sus formatos y modos de direccionamiento. Debes de entender que las instrucciones
son las “piezas” con las que vas a confeccionar tus programas, y decirle al controlador qué es lo que tiene
que hacer, cómo y cuándo. No te queda más remedio que aprenderlas, así que presta atención y ten
paciencia.

En el área de prácticas se presentarán varios ejemplos que los vas a ejecutar con el simulador
incluido en el MPLAB-IDE. Ya lo conoces. Con esos ejemplos, además de insistir en las técnicas de
programación y depuración, tendrás la oportunidad de verificar el funcionamiento de la mayor parte de las
instrucciones. El simulador es una herramienta muy eficaz y didáctica para ello.

ÁREA DE TEORÍA

T-4.1 Modos de direccionamiento


T-4.1.1 Direccionamiento inmediato
T-4.1.2 Direccionamiento directo
T-4.1.3 Direccionamiento indirecto
T-4.1.4 Direccionamiento relativo al PC
T-4.1.4 Direccionamiento directo del PC

T-4.2 Formato de las instrucciones


T-4.2.1 Instrucciones Inmediatas: addlw, andlw, iorlw, movlw, sublw, xorlw, call y goto
T-4.2.2 Instrucciones orientadas a registros: addwf, andwf, clrf, clrw, comf, decf, decfsz, incf, incfsz,
iorwf, movf, movwf, rlf, rrf, subwf, swapf y xorwf
T-4.2.3 Instrucciones orientadas al bit: bcf, bsf, btfsc y btfss
T-4.2.4 Instrucciones de control: decfsz, incfsz, nop, goto, call, clrwdt, retfie, retlw, return y sleep

ÁREA DE PRÁCTICAS

P-4.1 Ejemplo 4-1: Direccionamiento directo


P-4.1.1 Descripción / edición del programa fuente
P-4.1.2 Creación del proyecto y ensamblado
P-4.1.3 Ejecución / depuración
P-4.1.4 Ahora tú

P-4.2 Ejemplo 4-2: Direccionamiento indirecto


P-4.2.1 Descripción / edición del programa fuente
P-4.2.2 Creación del proyecto y ensamblado
P-4.2.3 Ejecución / depuración
P-4.2.4 Ahora tú

P-4.3 Ejemplo 4-3: Temporizaciones


P-4.3.1 Descripción / edición del programa fuente
P-4.3.2 Creación del proyecto y ensamblado

4-1
www.mkelectronica.com Microcontroladores PIC: Nivel I
P-4.3.3 Ejecución / depuración
P-4.3.4 Ahora tú

P-4.4 Ejemplo 4-4: Manipulación de bits


P-4.4.1 Descripción / edición del programa fuente
P-4.4.2 Creación del proyecto y ensamblado
P-4.4.3 Ejecución / depuración
P-4.4.4 Ahora tú

P-4.5 Ejemplo 4-5: Rotación de bits


P-4.5.1 Descripción / edición del programa fuente
P-4.5.2 Creación del proyecto y ensamblado
P-4.5.3 Ejecución / depuración
P-4.5.4 Ahora tú

MATERIAL COMPLEMENTARIO

 Guía rápida de referencia


o Juego de instrucciones
 Ejemplos Unidad 4
 Videos de los ejemplos
o Ejemplo 4-1
o Ejemplo 4-2
o Ejemplo 4-3
o Ejemplo 4-4
o Ejemplo 4-5
 Soluciones Unidad 3
 Cuestionario

4-2
www.mkelectronica.com Microcontroladores PIC: Nivel I
AREA DE TEORÍA

T- 4.1 MODOS DE DIRECCIONAMIENTO

La mayor parte de las instrucciones de un controlador necesitan para su funcionamiento de datos o


parámetros adicionales a los que llamaremos “operandos”. Así, una misma instrucción puede tener
diferentes formas de interpretarse y ejecutarse. Imagina una instrucción, por ejemplo SUMAR, que será
realizada por la ALU (Unidad Aritmético Lógica). Está claro que esa instrucción por sí sola no sirve de gran
cosa si no se indica también qué es lo que hay que sumar, es decir, el operando. Se supone que uno de los
sumandos está en el registro W, ¿y el segundo? Mira la figura.

Puede haber varias formas de expresar ese segundo operando.


Por ejemplo, te puede interesar sumar un dato constante, en cuyo caso
junto con la instrucción pondrías el dato. Por ejemplo: SUMAR 0x33
(sumar el valor hexadecimal 33). Sin embargo, en otras ocasiones puede
que te interese sumar un dato variable que se encuentra previamente
almacenado en una posición cualquiera de la memoria RAM de datos. En
este caso el comportamiento de la instrucción SUMAR 0x33 no será el
mismo. El controlador tendrá que ir a la dirección 0x33 de la memoria
RAM, recoger el valor que allí haya y realizar la suma con él. El
multiplexor MUX se encarga de proporcionar a la ALU el 2º sumando.
Este puede ser un dato inmediato, el 0x33, o el dato que viene desde la
posición 0x33. El resultado puede quedarse en el registro W o en la
misma posición 0x33 que suministró el 2º sumando.

A pesar de que la instrucción es la misma, SUMAR, el comportamiento es diferente. La misma


instrucción tendrá que tener un código diferente para cada caso. Diremos que la instrucción SUMAR tiene
dos “modos de direccionamiento” distintos que podremos emplear según nos convenga.

Los modos de direccionamiento definen los diferentes comportamientos que puede tener una
instrucción durante su ejecución.

Obviamente cada modelo de microcontrolador tiene sus propias instrucciones y modos de


direccionamientos, pero ahora nos vamos a centrar en el PIC16F886. Lo que vas a ver a continuación se
aplica a TODOS los miembros de la familia PIC16 y, con sencillas modificaciones, también a sus hermanos
menores de la familia PIC10 y PIC12, o a los hermanos mayores de la familia PIC18. Es un buen momento
de recordar algunas características de la arquitectura PIC que ya se comentaron en la Unidad 1:

 Arquitectura Harvard gracias a la cual la memoria de programa es más ancha que la de


datos y puede albergar instrucciones que se codifican con un mayor número de bits. En
el caso de la familia PIC16 las instrucciones se codifican con 14 bits.
 En esos 14 bits cabe tanto el código de la instrucción como el operando.
 Las instrucciones se buscan en un único ciclo de acceso a la memoria de programa.
 Las instrucciones se ejecutan en el mismo ciclo. Se busca una y se ejecuta la anterior.
 Nuestro controlador tiene un reducido juego de instrucciones (RISC).

T- 4.1.1 Direccionamiento inmediato

Lo emplean las instrucciones aritmético/lógicas. Junto con la instrucción se indica el valor inmediato
con el que hay que operar. De los 14 bits que tienen todas las instrucciones, los 8 bits de menos peso (Bit 7
8
– Bit 0), expresan un dato comprendido entre 0 y 255 (2 ), al que también se le llama “literal” (k). Los 6 de
más peso (Bit 13 – Bit 8) representan el código propio de la instrucción en particular.

Bit 13 Bit 8 Bit 7 Bit 0


Código de la Instrucción (OP CODE) Dato constante (literal k)

4-3
www.mkelectronica.com Microcontroladores PIC: Nivel I
Algunos ejemplos:

Cargar 0x12 ;Cargar 0x12 en el registro W o Work Register (.18 en dec. y 0b00010010 en bin)
Sumar 0x24 ;Sumar 0x24 al registro W. El resultado (0x36) se queda en W
Restar 0x66 ;Restar a 0x66 el registro W. El resultado (0x30) se queda en W

T- 4.1.2 Direccionamiento directo

También lo emplean la mayor parte de instrucciones aritmético/lógicas. Junto con la instrucción se


indica la dirección de la memoria RAM del área de datos donde se encuentra el dato con el que hay que
operar. Como se muestra en la figura, de los 14 bits que tienen todas las instrucciones, los 7 bits de menos
peso (Bit 6 – Bit 0) sirven en este caso para expresar esa dirección. Los otros 7 de más peso (Bit 13 – Bit 7)
codifican a la instrucción.

Bit 13 Bit 7 Bit 6 Bit 0


Código de la Instrucción (OP CODE) Dirección del registro f

En primer lugar, hay que aclarar que cualquier dirección de la memoria RAM de datos, es un
registro denominado por Microchip como “File” (f). Entre ellos también están incluidos los llamados SFR
“Special Function Registers” (registros de funciones especiales). El valor que contenga cualquiera de ellos
se puede utilizar en cualquier operación y, lo que es más importante, el resultado de esa operación se
puede redirigir al mismo registro. No hay instrucciones especiales para manejar registros especiales.
Nuestro controlador tiene un juego reducido de instrucciones (RISC), no lo olvides.

Algún ejemplo:

Cargar 0x12 ;Cargar el registro W con el dato que hay en el registro 0x12 del área de datos
Sumar 0x24 ;Sumar a W con el dato que hay en el registro 0x24 del área de datos
Restar 0x66 ;Al dato que hay en el registro 0x66 se le resta el valor que tenga el registro W

En cualquiera de las instrucciones anteriores, el resultado se puede quedar en el registro W o


reenviarlo al propio registro con el que se operó. Ya veremos más adelante cómo hacerlo. El ejemplo
también nos puede ayudar a comprender cómo es posible que, en un único ciclo, se pueda buscar una
instrucción y ejecutar la anterior. Vamos a repasarlo:

1. Cuando se busca la primera instrucción de nuestro programa, Cargar 0x12, no hay


ninguna previa para ejecutar. El PIC se limita a buscar la siguiente.

2. Al mismo tiempo que busca la instrucción Sumar 0x24 en el área de programa, el PIC
accede a la posición 0x12 del área de datos para ejecutar la instrucción Cargar 0x12
anterior. Esto es posible porque en la arquitectura Harvard los buses de la memoria de
instrucciones y de la memoria de datos están separados ¿Lo recuerdas?

3. Al mismo tiempo que busca la instrucción Restar 0x66 en el área de programa, el PIC
accede a la posición 0x24 del área de datos para ejecutar la instrucción Sumar 0x24
anterior.

4. Al mismo tiempo que busca la siguiente instrucción, el PIC accede a la posición 0x66 del
área de datos para ejecutar la instrucción anterior de Restar 0x66.

5. El proceso se repite indefinidamente. En un único ciclo se busca una instrucción y se


ejecuta la anterior. Hay una única excepción para esta mecánica de funcionamiento.
Ocurre con las instrucciones de “Salto” que necesitan dos ciclos. Esto también lo verás
más adelante.

4-4
www.mkelectronica.com Microcontroladores PIC: Nivel I
A pesar de todo lo explicado
quizá te hayas dado cuenta de un
pequeño problema. Si la memoria de
datos de nuestro PIC tiene un total de
368 registros, SIN contar con los
registros SFR especiales, ¿cómo es
posible seleccionar a cualquiera de ellos
con los únicos 7 bits (Bit 6 - Bit 0) que
acompañan a las instrucciones en este
modo de direccionamiento? ¡Vaya
dilema! Con 7 bits sólo se pueden
seleccionar 128 registros distintos
7
(2 =128).

¿Te acuerdas del sistema de bancos de memoria que emplean los PIC’s? Ahora es el momento de
entrar en más detalles. Observa la figura.

Cada banco de datos RAM consta de un total de 128 registros como máximo y se pueden
seleccionar directamente mediante los 7 bits (6:0) que acompañan a la instrucción. Mediante los bits
RP1:RP0 del registro STATUS se selecciona el banco deseado de entre los cuatro posibles.

Es de suponer que el programador se habrá preocupado de seleccionar adecuadamente el banco


deseado, ANTES de ejecutar la instrucción de direccionamiento directo. Como ya se ha comentado esto
puede resultar tedioso, pero es el precio que hay que pagar para mantener la compatibilidad con otros
dispositivos que dispongan de más memoria RAM. La estructura de la instrucción seguirá siendo la misma y
empleará los mismos 7 bits para seleccionar un registro dentro de un banco. En algún lugar habrá ciertos
bits que permitan seleccionar de entre los múltiples bancos disponibles. En la actualidad tenemos los bits
RP1:RP0 del registro STATUS.

Otra cosa. Es fácil suponer que la selección de bancos mediante los bits RP1:RP0 del registro
STATUS, se va a convertir en una tarea cotidiana. Pero si tenemos en cuenta que el propio registro
STATUS se encuentra en un banco, ¿Qué pasa con él al cambiar de banco? ¿Se pierde? ¿Cómo volvemos
entonces al banco original? No te preocupes. Si repasas el listado general de registros y bancos del área de
memoria RAM, y que recomiendo que siempre tengas a mano, observarás que el registro STATUS se repite
en todos los bancos. Problema resuelto. Selecciones el banco que selecciones, el registro STATUS siempre
estará a mano para poder seleccionar a otro banco distinto.

Ahora tú

Supón que el área de memoria RAM de datos tiene, en algunas de sus posiciones,
los valores que se muestran en la figura. Completa la siguiente tabla calculando el
valor que tendrá el registro W según se van ejecutando las diferentes instrucciones
contenidas en ella.

INSTRUCCIÓN OPERANDO DIRECCIONAMIENTO Valor en W


Cargar 0x10 Directo
Sumar 0x03 Inmediato
Sumar 0x33 Directo
Restar 0x20 Inmediato
Sumar 0x20 Directo
Restar 0x52 Inmediato
Sumar 0x52 Directo

A mí me da como resultado el valor 0x23. ¿A ti? __________________

4-5
www.mkelectronica.com Microcontroladores PIC: Nivel I
T- 4.1.3 Direccionamiento indirecto

Vamos a seguir poniendo a prueba nuestra capacidad, con este extraño (pero útil) modo de
direccionamiento. De él se puede decir que la dirección donde se encuentra el dato con el que hay que
operar, no la damos en la instrucción, sino que se supone previamente almacenada en un registro. En el
caso de los controladores PIC, este registro se llama FSR (File Selector Register) y se encuentra en la
dirección 0x04 del área RAM de datos. No confundir con la expresión SFR, que hace referencia a los
Special Function Registers en general (vaya lío). Es decir, el registro FSR contiene la dirección donde hay
que buscar el dato.

Ahora bien, estás tratando con un controlador de tipo RISC (juego reducido de instrucciones). Esto
implica que no se puede permitir el lujo de tener instrucciones específicas para emplear el direccionamiento
indirecto. Es más, aparentemente el direccionamiento indirecto es idéntico al directo que vistes antes.
¿Dónde está entonces la diferencia? Pues es muy sencillo (o casi). Cuando una instrucción emplea la
dirección 0x00 y SOLO la 0x00, el controlador entiende que realmente lo que queremos decir, es que el
dato se encuentra en la dirección expresada por el registro FSR. El formato se muestra en la siguiente tabla:

Bit 13 Bit 7 Bit 6 Bit 0


Código de la Instrucción (OP CODE) Dirección 0x00

La dirección 0x00 del área de datos RAM se corresponde con el registro llamado INDF (INDirect
File). Este registro no existe físicamente. Simplemente cuando una instrucción emplea su dirección,
automáticamente se entiende que se va a utilizar el modo indirecto de direccionamiento. Quizá un ejemplo
te ayude a digerir todo esto:

Cargar FSR 0x24 ;Cargar el registro FSR con el valor 0x24


Cargar 0x00 ;Cargar el registro W con lo que hay en la dirección 0x24
Cargar FSR 0x12 ;Cargar el registro FSR con el valor 0x12
Sumar 0x00 ;Sumar el registro W con lo que hay en la dirección 0x12
Cargar FSR 0x66 ;Cargar el registro FSR con el valor 0x66
Restar 0x00 ;Restar a lo que hay en la dirección 0x66 el valor del registro W

Otro detalle que hay que tener en cuenta. El registro FSR contiene la dirección donde hay que ir a
8
buscar el dato, pero como es de 8 bits sólo puede direccionar a 256 registros diferentes (2 ). ¿Cómo se
accede de forma indirecta a cualquiera de los 368 registros que tiene nuestro PIC16F886? Bueno, pues
aquí también entra en juego el sistema de bancos de memoria. Observa la figura.

En esta ocasión interviene el bit IRP del


registro STATUS. Si este bit lo pones a nivel “0”, la
próxima instrucción con direccionamiento indirecto
empleará los bancos 0 y 1. Si se pone a nivel “1”
empleará los bancos 2 y 3. Es decir, en el
direccionamiento indirecto, el bit IRP selecciona
parejas de bancos. Como cada banco tiene 128
registros, una pareja de bancos forma un total de
256, y cualquiera de éstos se puede seleccionar
individualmente mediante los 8 bits del registro
8
FSR (2 ).

Queda así resuelto el problema y se dejan


las puertas abiertas a nuevos dispositivos con
mayor capacidad de memoria RAM de datos. En
algún lugar habrá un bit que permita seleccionar
otras parejas de bancos.

4-6
www.mkelectronica.com Microcontroladores PIC: Nivel I
Unas últimas consideraciones. El registro FSR es un registro como cualquier otro, que se puede leer
y escribir, y que se encuentra en la posición 0x04 del área RAM de datos. Lo mismo sucede con el registro
INDF que, aunque es un registro ficticio, se encuentra en la dirección 0x00. Si observas el listado de
registros y bancos verás que ambos registros se encuentran disponibles en todos los bancos para poder
hacer uso de ellos en cualquier momento.

Recuerda: el direccionamiento “INDIRECTO” se produce cuando, con el direccionamiento


“DIRECTO”, empleas la dirección 0x00 y SOLO la dirección 0x00.

Ahora tú

Supón que el área de memoria RAM de datos tiene, en algunas de sus


posiciones, los valores que se muestran en la figura. Completa la siguiente
tabla calculando el valor que tendrá el registro W según se van ejecutando las
diferentes instrucciones contenidas en ella, y en función de los distintos valores
del registro FSR. Damos por supuesto que el bit IRP del registro STATUS está
a nivel “0”, por lo que se seleccionan los bancos 0 y 1.

FSR INSTRUCCIÓN DIRECCIONAMIENTO Valor en W


0x25 Cargar 0x02 Inmediato
0x38 Sumar 0x52 Directo
0x10 Sumar 0x00 Directo
0x12 Restar 0x13 Inmediato
0xB3 Restar 0x00 Directo
0xC8 Sumar 0x00 Directo
0XC8 Restar 0x0E Inmediato
0x10 Sumar 0x00 Directo
0x52 Restar 0x00 Directo
0x20 Sumar 0x20 Directo
0x20 Sumar 0x00 Inmediato
0x20 Restar 0x27 Inmediato
0xA0 Restar 0x00 Directo
0XB3 Sumar 0x33 Directo
0xB3 Sumar 0x00 Directo

A mí me da como resultado final el valor 0x18. ¿A ti? _______________

Recuerda: En los controladores PIC, en la operación de restar, el registro W actúa como sustraendo.
El minuendo es el dato que acompaña a la propia instrucción en el caso de direccionamiento
inmediato, o el dato que hay en la posición indicada en caso de que emplees el direccionamiento
directo. Es decir, Resultado = Operando – Registro W.

T-4.1.4 Direccionamiento relativo al PC

El PC (“Program Counter”) o contador de programa consiste, como su nombre indica, en un


contador que direcciona el área de memoria FLASH de programa. Cada vez que se ejecuta una instrucción
se incrementa en una unidad, apuntando así a la siguiente. Consta de 13 bits con lo cual puede direccionar
13
hasta 8.192 posiciones (2 ), donde se pueden llegar a almacenar otras tantas instrucciones de un
programa.

De los 13 bits que dispone este contador, los 8 bits de menos peso se ven reflejados en uno de los
registros especiales (SFR) del área de datos, el PCL, que se encuentra en la posición 0x02. Con éste, como
con cualquier otro registro, sea o no especial, se puede realizar cualquier tipo de operación aritmético/lógica.

4-7
www.mkelectronica.com Microcontroladores PIC: Nivel I
Pues bien, cuando se ejecuta una instrucción cuyo resultado modifica el valor de ése registro PCL (dirección
0x02), como se muestra en la siguiente tabla, realmente se están modificando los 8 bits de menos peso del
PC. Esto origina lo que se llama un “salto” relativo.

Bit 13 Bit 7 Bit 6 Bit 0


Código de la Instrucción (OP CODE) Dirección 0x02

Fíjate en el siguiente ejemplo:

Dirección en PC Instrucción Comentarios


0x0003 Cargar 0x22 Cargar en el registro W el valor 0x22
0x0004 Sumar 0x06 Sumar 0x06 inmediato al registro W
0x0005 Guardar 0x02 El resultado en W (0x28) se deposita en
PCL (posición 0x02). Salto relativo.
---------- --------
---------- --------
0x0028 -------- Siguiente instrucción a ejecutar

Supón que el PC tiene un valor inicial de, por ejemplo 0x0003, que apunta a la instrucción Cargar
0x22. Cuando ésta se ejecuta, el PC se incrementa en una unidad (0x0004) y apunta a la instrucción Sumar
0x06. Cuando ésta se ejecuta el PC se incrementa (0x0005) y apunta a la instrucción Guardar 0x02. La
ejecución de esta instrucción implica modificar el registro PCL y por tanto al PC. Si actualmente PCL valía
0x05, al ejecutar esta última instrucción valdrá 0x28. Se ha producido por tanto un salto ya que el PC, antes
de ejecutar la instrucción Guardar valía 0x0005, y después de ejecutada, se queda con 0x0028. Esto es un
Salto Relativo al PC.

Nuevamente nos surge otro dilema. Al tratarse de un núcleo cuya ALU es de 8 bits todos los
resultados aritméticos/lógicos son, efectivamente, de 8 bits. Si este resultado lo empleamos para modificar
el PCL y provocar saltos dentro de la memoria de programa, queda claro que sólo podremos movernos en
8
una región de 256 posiciones (2 ). Si nuestra memoria de programa es de 8.192 posiciones ¿cómo
podemos desplazarnos a cualquier posición de la misma?

En esta ocasión interviene un nuevo


registro de los llamados especiales, el PCLATH.
Sus 5 bits de menos peso aportan al PC los 5 bits
de más peso que le faltan. Mira la figura. Es decir,
con cualquier instrucción en la que el resultado
implique modificar al registro PCL, éste se copia
sobre los 8 bits de menos peso del PC y los 5 bits
de más peso los aporta el registro PCLATH, en
total los 13 bits que tiene el PC.

De nuevo queda patente las posibilidades de ampliación de la memoria FLASH de programa, de


cara a futuros dispositivos. Las instrucciones que modifican el PCL siguen siendo las mismas y compatibles,
pero el PCLATH en lugar de 5, puede aportar un mayor número de bits, para completar un PC más grande
que gestione una mayor cantidad de memoria FLASH de programa.

Importante. El registro PCLATH tienes que actualizarlo ANTES de ejecutar la instrucción que
modifica el PCL. En caso contrario el salto relativo se producirá a una dirección que no has previsto.

Ahora tú

Completa la siguiente tabla que contiene tres programas de ejemplo. En el nº 1 se supone al


PCLATH con el valor 0x03, en el nº 2 con 0x00 y en el nº 3 con 0x11. Se trata de calcular la dirección a la
que salta el PC cuando se ejecutan las instrucciones de cada ejemplo.

4-8
www.mkelectronica.com Microcontroladores PIC: Nivel I
EJEMPLO Valor del Dirección Instrucción a Direccionamiento El PC salta
PCLATH actual del PC ejecutar a…
0x0010 Cargar 0x03 Inmediato
1 0x03 0x0011 Sumar 0x05 Inmediato
0x0012 Guardar en 0x02 Directo
0x0124 Cargar 0x21 Inmediato
2 0x00 0x0125 Sumar 0x02 Directo
0x0126 Guardar en 0x02 Directo
0x0020 Cargar 0x02 Directo
3 0x11 0x0021 Sumar 0x02 Directo
0x0022 Guardar en 0x02 Directo

A mí me sale: 1º = 0x0308, 2º = 0x0047 y 3º = 0x1143, ¿a ti? 1º = _______, 2º = _______ y 3 º= _______

NOTA: Debes recordar que en la arquitectura Harvard se ejecuta una instrucción y se busca la
siguiente. Ten cuidado con la dirección actual del PC. Por ejemplo, cuando se ejecuta la instrucción
Sumar 0x02 de forma directa en el ejemplo nº 2, el PC ya no está en la dirección 0x0125, está en la
0x0126.

T-4.1.4 Direccionamiento directo del PC

Este tipo de direccionamiento únicamente lo emplean dos instrucciones de salto: Salto y Salto a
subrutina, y afectan al área de memoria FLASH de programa. Como puedes ver en el formato de la
siguiente tabla, junto al código de operación de 3 bits de estas dos instrucciones (Bit 13 – Bit 11), se indica
un valor de 11 bits que expresa la dirección de salto (Bit 10 – Bit 0).

Bit 13 Bit 11 Bit 10 Bit 0


Código de la Instrucción Dato constante (literal)
(OP CODE)

Esos 11 bits, que acompañan a la instrucción se copian directamente sobre los 11 bits de menos
11
peso del PC, produciendo así un salto con un desplazamiento de hasta 2.048 posiciones (2 ). Sin embargo
nos surge otra vez la misma duda. Si nuestro PIC dispone de un área de memoria de programa de 8.192
posiciones, ¿cómo nos podemos desplazar más allá de esas 2.048 posiciones? La respuesta la
encontramos en la figura.

Efectivamente, las instrucciones GOTO o


CALL aportan 11 bits con la dirección de
salto. Los bits <4:3> del registros PCLATH
aportan los dos bits restantes para completar
un PC de 13 bits. Nos podemos por tanto
imaginar que la memoria de programa se
organiza en cuatro bancos de 2.048
posiciones cada uno y que los dos bits de
2
PCLATH seleccionan a uno de ellos (2 ).

Una vez más salta a la vista las posibilidades de cara a una ampliación futura de la memoria de
programa. Sin cambiar el formato de las instrucciones de salto GOTO o CALL, se pueden emplear más bits
del registro PCLATH para completar un PC más grande y gestionar así un mayor número de bancos de
2.048 posiciones de esta área de memoria.

Importante. El registro PCLATH tienes que actualizarlo ANTES de ejecutar una instrucción GOTO o
CALL. En caso contrario el salto relativo se producirá a una dirección que no has previsto.

4-9
www.mkelectronica.com Microcontroladores PIC: Nivel I
Mira el siguiente ejemplo:

Cargar xxx01xxx ;Cargar en el registro W el valor binario xxx01xxx


Guardar en PCLATH ;Ajustar el registro PCLATH con el banco 1
Saltar 0x0005 ;Saltar (GOTO) a la posición 0x0005 del banco 1 (0x0805)

T-4.2 FORMATO DE LAS INSTRUCCIONES

Como ya se ha dicho reiteradamente, todas las instrucciones de los controladores de la familia


PIC16 en general y del PIC16F886 en particular, se codifican siempre con 14 bits de anchura. En esos 14
bits se expresa tanto el código de operación de la propia instrucción, como el parámetro u operando que
precisa. A continuación vamos a ver todo el juego de instrucciones clasificadas según su modo de
direccionamiento y orientación. Ten paciencia porque no queda más remedio que estudiarlas.

En el material complementario puedes descargarte una guía rápida resumida con el juego completo
de instrucciones. Es recomendable que la agrupes junto con las otras guías rápidas y la tengas
siempre a mano.

T-4.2.1 Instrucciones Inmediatas

Algunas ya las has usado en el área de prácticas de la Unidad 3 anterior. En general las
instrucciones con direccionamiento inmediato son aquellas en las que el dato con el que hay que operar se
indica en la propia instrucción.

Bit 13 Bit 8 Bit 7 Bit 0


OP CODE k

OP CODE: Los Bits<13:8> (6) representan al código propio de la instrucción.


k: Los Bits<7:0> (8) representan el dato inmediato k con el que hay que operar.

T-4.2.1.1 Sumar W (ADDLW)

Suma el contenido actual del registro W con el valor que se indique en la instrucción. Los bits C, DC
y Z del registro STATUS se pueden modificar de acuerdo con el resultado de la suma. Puede haber llevada
en el 8º bit (C=1) o en el 4º bit (DC=1), o puede que no la haya. El resultado también puede ser cero (Z=1) o
distinto de cero (Z=0).

ADDLW Sumar W con la constante k


Sintaxis ADDLW k
Operando k es una valor inmediato de 8 bits entre 0 y 255
Operación (W) + k  (W)
Bits de estado C,DC,Z
Descripción Al contenido actual del registro W se le suma el dato
inmediato k. El resultado de la suma se deja en W.
C=0 si W < 255, C=1 si W > 255. DC=0 si W<3:0> <
15, DC=1 si W<3:0> > 15, Z=0 si W !=0 y Z=1 si W=0
Ejemplo Antes de la instrucción: W=0x03
Instrucción ejecutada: ADDLW 0x04
Después de la instrucción: W=0x07
C=0,DC=0 y Z=0

4-10
www.mkelectronica.com Microcontroladores PIC: Nivel I
T-4.2.1.2 Función lógica AND (ANDLW)

Realiza la función AND, bit a bit, entre el contenido actual del registro W y el valor que se indique en
la instrucción.

ANDLW Función lógica AND entre W y k


Sintaxis ANDLW k
Operando k es un valor inmediato de 8 bits entre 0 y 255
Operación (W) .AND. k  W
Bits de estado Z
Descripción Realiza la función lógica AND entre el contenido
actual de W y el dato inmediato k
Ejemplo Antes de la instrucción: W=0xFF
Instrucción ejecutada: ANDLW 0x0F
Después de la instrucción: W=0x0F

T-4.2.1.3 Función lógica OR (IORLW)

Realiza la función OR bit a bit entre el contenido actual del registro W y el valor que se indique en la
instrucción.

IORLW Función lógica OR entre W y k


Sintaxis IORLW k
Operando k es un valor inmediato de 8 bits entre 0 y 255
Operación (W) .OR. k  W
Bits de estado Z
Descripción Realiza la función lógica OR entre el contenido
actual de W y el dato inmediato k
Ejemplo Antes de la instrucción: W=0xB7
Instrucción ejecutada: IORLW 0x0F
Después de la instrucción: W=0xBF

T-4.2.1.4 Cargar W (MOVLW)

Carga el registro W con el valor indicado en la instrucción.

MOVLW Carga el W con la constante k


Sintaxis MOVLW k
Operando k es un valor inmediato de 8 bits entre 0 y 255
Operación k  (W)
Bits de estado Ninguno
Descripción Carga el registro W con el dato inmediato k
Ejemplo Antes de la instrucción: W=0xB7
Instrucción ejecutada: MOVLW 0x0F
Después de la instrucción: W=0x0F

T-4.2.1.5 Restar el registro W (SUBLW)

Resta al valor indicado en la instrucción, el contenido actual del registro W. Los bits C, DC y Z del
registro STATUS se pueden modificar con el resultado de la operación. Puede haber llevada en el 8º bit
(C=0) o en el 4º bit (DC=0), o puede que no la haya. El resultado también puede ser 0 (Z=1) o distinto de 0
(Z=0).

SUBLW Restar a la constante k el registro W


Sintaxis SUBLW k
Operando k es una valor inmediato de 8 bits entre 0 y 255
Operación k – (W)  (W)

4-11
www.mkelectronica.com Microcontroladores PIC: Nivel I
Bits de estado C,DC,Z
Descripción Al valor de la constante k se le resta el contenido del
registro W. El resultado de la resta se deja en W.
C=0 si W>k, C=1 si W≤k, DC=0 si W<3:0> > k<3:0>
y DC=1 si W<3:0>≤ k<3:0>, Z=1 si k=W.
Ejemplo Antes de la instrucción: W=0x03
Instrucción ejecutada: SUBLW 0x07
Después de la instrucción: W=0x04
C=1, DC=1 y Z=0

T-4.2.1.6 Función lógica OR exclusiva (XORLW)

Realiza la función lógica OR exclusiva (XOR) entre el valor actual del registro W y el que se indica
en la instrucción

XORLW Función lógica XOR entre W y k


Sintaxis XORLW k
Operando k es un valor inmediato de 8 bits entre 0 y 255
Operación (W) .XOR. k  W
Bits de estado Z
Descripción Realiza la función lógica XOR entre el contenido
actual de W y el dato inmediato k
Ejemplo Antes de la instrucción: W=0xB7
Instrucción ejecutada: XORLW 0x0F
Después de la instrucción: W=0xB8

T-4.2.1.7 Salto a subrutina (CALL)

Salto de forma inmediata e incondicional a la dirección de la memoria FLASH del área de programa
donde da comienzo la subrutina o función. En la memoria Stack se salva la dirección de donde se parte
para luego poder retornar a la misma.

Su puede considerar como una instrucción de direccionamiento inmediato, ya que junto con la
instrucción se indica la dirección de salto.

Bit 13 Bit 11 Bit 10 Bit 0


OP CODE k

OP CODE: Bits<13:11> Tres bits que representan el código de la propia instrucción.


k: Bits<10:0> (11) que representan la dirección del área de programa con la que se carga el
11
PC (2 =2048).

CALL Salto a subrutina


Sintaxis CALL k
Operando k es una valor de 11 bits entre 0 y 2047 que expresa la
dirección de inicio de la subrutina
Operación (PC)+1  TOS (guarda en stack la dirección de origen)
k  PC<10:0>
(PCLATH<4:3>)  PC<12:11>
Bits de estado Ninguno
Descripción Salto a la dirección k donde comienza la subrutina. En
primer lugar se salva la dirección de retorno (PC+1)
sobre la memoria de stack (TOS). A continuación el valor
k se copia en los 11 bits de menos peso del PC
(PC<10:0>) y el valor de los bits (PCLATH<4:3>) sobre
los bits (PC<12:11>. Se produce el salto.
Ejemplo Antes de la instrucción: PC=0x0005
Instrucción ejecutada: CALL 0x1000

4-12
www.mkelectronica.com Microcontroladores PIC: Nivel I
Después de la instrucción: PC=0x1000
TOS=0x0006

Atención: Debes asegurarte de que los bits <4:3> del registro PCLATH están debidamente
actualizados ANTES de ejecutar esta instrucción, apuntando a la página deseada.

T-4.2.1.8 Salto (GOTO)

Salto de forma inmediata e incondicional a la dirección de la memoria FLASH del área de programa
indicada. Su puede considerar como una instrucción de direccionamiento inmediato, ya que junto con la
instrucción se indica la dirección de salto.

Bit 13 Bit 11 Bit 10 Bit 0


OP CODE k

OP CODE: Bits<13:11> Tres bits que representan el código de la propia instrucción.


k: Bits<10:0> 11 bits que representan la dirección del área de programa con la que se carga el
11
PC (2 =2048).

GOTO Salto incondicional


Sintaxis GOTO k
Operando k es una valor de 11 bits entre 0 y 2047 que expresa la
dirección de salto
Operación k  PC<10:0>
(PCLATH<4:3>)  PC<12:11>
Bits de estado Ninguno
Descripción Salto a la dirección k de la memoria de programa. El
valor k se copia en los 11 bits de menos peso del PC
(PC<10:0>) y el valor de los bits (PCLATH<4:3>) sobre
los bits (PC<12:11>. Se produce el salto.
Ejemplo Antes de la instrucción: PC=0x0005
Instrucción ejecutada: GOTO 0x1000
Después de la instrucción: PC=0x1000

Atención: Debes asegurarte de que los bits <4:3> del registro PCLATH están debidamente
actualizados ANTES de ejecutar esta instrucción, apuntando a la página deseada.

T-4.2.2 Instrucciones orientadas a registros

Son las instrucciones que emplean el direccionamiento directo. Junto a la instrucción se indica la
dirección del registro del área de datos con el que hay que operar. El resultado de la operación se puede
quedar en el registro W, o bien dirigirse al mismo registro con el que se realizó esa operación.

Bit 13 Bit 8 Bit 7 Bit 6 Bit 0


OP CODE d f

OP CODE: Bits<13:8> 6 bits que representan al código de la propia instrucción.


d: Bit<7> Bit que representa al destino del resultado. Si d=0 el destino es el registro W; si d=1
el destino es el propio registro f.
f: Bits<6:0> 7 bits que indican la dirección del área de datos donde se encuentra el registro
7
con el que hay que operar. Esa dirección está comprendida entre 0x00 y 0x7F (2 =128).

Atención: Debes asegurarte de seleccionar previamente el banco apropiado mediante los bits RP1 y
RP0 del registro STATUS.

4-13
www.mkelectronica.com Microcontroladores PIC: Nivel I
T-4.2.2.1 Sumar W (ADDWF)

El contenido actual del registro W se suma con el contenido que haya en la posición de memoria del
área de datos indicada.

ADDWF Sumar W con el contenido de f


Sintaxis ADDWF f,d
Operandos f es la dirección de un registro RAM entre 0 y 127
d es el destino del resultado: 0=W, 1=registro
Operación (W) + (f)  (destino)
Bits de estado C,DC,Z
Descripción Suma el contenido de W con el del registro f. Si d=0
el resultado se queda en W. Si d=1 el resultado se
queda en el propio registro f
Ejemplo Antes de la instrucción: W=0x03
f(0x20) = 0x04
Instrucción ejecutada: ADDWF 0x20,1
Después de la instrucción: W=0x03
f(0x20)=0x07

T-4.2.2.2 Función lógica AND (ANDWF)

Realiza la función lógica AND, bit a bit, entre el contenido de W y el contenido de la posición del
área de datos indicada.

ANDWF Función AND entre W y el registro f


Sintaxis ANDWF f,d
Operandos f es la dirección de un registro RAM entre 0 y 127
d es el destino del resultado: 0=W, 1=registro
Operación (W) .AND. (f)  (destino)
Bits de estado Z
Descripción Realiza la función lógica AND entre el contenido de
W y el del registro f. Si d=0 el resultado se queda en
W. Si d=1 el resultado se queda en el propio registro
f
Ejemplo Antes de la instrucción: W=0xFF
f(0x20) = 0x0F
Instrucción ejecutada: ANDWF 0x20,0
Después de la instrucción: W=0x0F
f(0x20)=0x0F

T-4.2.2.3 Borrar un registro (CLRF)

Pone a 0 el contenido de la posición de memoria del área de datos indicada.

CLRF Borrar el registro f


Sintaxis CLRF f
Operando f es el registro RAM entre 0 y 127 cuyo contenido se
va a borrar
Operación 0x00  f
1Z
Bits de estado Z
Descripción Se borran todos los bits del registro f y el bit Z del
registro STATUS se pone a “1”
Ejemplo Antes de la instrucción: f(0x20)=0x33
Z=0
Instrucción ejecutada: CLRF 0x20
Después de la instrucción: f(0x20)=0x00
Z=1

4-14
www.mkelectronica.com Microcontroladores PIC: Nivel I
T-4.2.2.4 Complementar el contenido de un registro (COMF)

Realiza el complemento a 1 del valor actual de la posición del área de memoria de datos indicada.
Complemento a 1 significa que todos los bits cambian de estado. Los que estaban a nivel “1” pasan a nivel
“0” y viceversa.

COMF Complemento a 1 del registro f


Sintaxis COMF f,d
Operando f es la dirección de un registro RAM entre 0 y 127
d es el destino del resultado: 0=W, 1=registro
Operación (/f)  (destino)
Bits de estado Z
Descripción Se hace el complemento a uno del registro f. Si d=0
el resultado se queda en W. Si d=1 el resultado se
queda en el propio registro f
Ejemplo Antes de la instrucción: f(0x20)=0xAA
Instrucción ejecutada: COMF 0x20,0
Después de la instrucción: f(0x20)=0xAA
W=0x55

T-4.2.2.5 Decrementar un registro (DECF)

Decrementa en una unidad el valor que haya en la posición de memoria del área de datos indicada.

DECF Decremento del valor del registro f


Sintaxis DECF f,d
Operando f es la dirección de un registro RAM entre 0 y 127
d es el destino del resultado: 0=W, 1=registro
Operación (f)-1  (destino)
Bits de estado Z
Descripción Decrementa en una unidad el valor actual del
registro f. Si d=0 el resultado se queda en W. Si d=1
el resultado se queda en el propio registro f
Ejemplo Antes de la instrucción: f(0x20)=0x01
Instrucción ejecutada: DECF 0x20,0
Después de la instrucción: f(0x20)=0x01
W=0x00
Z=1

T-4.2.2.6 Decrementar un registro y saltar (DECFSZ)

Decrementa en una unidad el valor que haya en la posición de memoria del área de datos indicada.
Si el resultado del decremento es igual a 0, el PC salta una instrucción. En caso contrario el PC sigue su
curso.

DECFSZ Decremento de f y salto si es 0


Sintaxis DECFSZ f,d
Operando f es la dirección de un registro RAM entre 0 y 127
d es el destino del resultado: 0=W, 1=registro
Operación (f)-1  (destino)
Salto si el resultado es 0x00 (PC=PC+1)
Bits de estado Ninguno
Descripción Decrementa en una unidad el valor actual del
registro f. Si d=0 el resultado se queda en W. Si d=1
el resultado se queda en el propio registro f. Si el
resultado es 0x00 se salta una instrucción
(PC=PC+1). Si es distinto de 0x00 se ejecuta la

4-15
www.mkelectronica.com Microcontroladores PIC: Nivel I
siguiente instrucción.
Ejemplo Antes de la instrucción: f(0x20)=0x01
Instrucción ejecutada: DECFSZ 0x20,1
Después de la instrucción: f(0x20)=0x00
PC=PC+1

T-4.2.2.7 Incrementar un registro (INCF)

Incrementa en una unidad el valor que haya en la posición de memoria del área de datos indicada.

INCF Incremento del valor del registro f


Sintaxis INCF f,d
Operando f es la dirección de un registro RAM entre 0 y 127
d es el destino del resultado: 0=W, 1=registro
Operación (f)+1  (destino)
Bits de estado Z
Descripción Incrementa en una unidad el valor actual del registro
f. Si d=0 el resultado se queda en W. Si d=1 el
resultado se queda en el propio registro f
Ejemplo Antes de la instrucción: f(0x20)=0x01
Instrucción ejecutada: INCF 0x20,0
Después de la instrucción: f(0x20)=0x01
W=0x02
Z=0

T-4.2.2.8 Incrementar un registro y saltar (INCFSZ)

Incrementa en una unidad el valor que haya en la posición de memoria del área de datos indicada.
Si el resultado del incremento se desborda y se quede con el valor 0, el PC salta una instrucción. En caso
contrario el PC sigue su curso.

INCFSZ Incremento de f y salto si es 0


Sintaxis INCFSZ f,d
Operando f es la dirección de un registro RAM entre 0 y 127
d es el destino del resultado: 0=W, 1=registro
Operación (f)+1  (destino)
Salto si el resultado es 0x00 (PC=PC+1)
Bits de estado Ninguno
Descripción Incrementa en una unidad el valor actual del registro
f. Si d=0 el resultado se queda en W. Si d=1 el
resultado se queda en el propio registro f. Si el
resultado es 0x00 se salta una instrucción
(PC=PC+1). Si es distinto de 0x00 se ejecuta la
siguiente instrucción.
Ejemplo Antes de la instrucción: f(0x20)=0xFF
Instrucción ejecutada: INCFSZ 0x20,1
Después de la instrucción: f(0x20)=0x00
PC=PC+1

T-4.2.2.9 Función lógica OR (IORWF)

Realiza la función lógica OR, bit a bit, entre el contenido actual del registro W y el contenido de la
posición de memoria del área de datos indicada.

IORWF Función OR entre W y el registro f


Sintaxis IORWF f,d
Operandos f es la dirección de un registro RAM entre 0 y 127
d es el destino del resultado: 0=W, 1=registro
Operación (W) .OR. (f)  (destino)

4-16
www.mkelectronica.com Microcontroladores PIC: Nivel I
Bits de estado Z
Descripción Realiza la función lógica OR entre el contenido de W
y el del registro f. Si d=0 el resultado se queda en W.
Si d=1 el resultado se queda en el propio registro f
Ejemplo Antes de la instrucción: W=0x60
f(0x20) = 0x13
Instrucción ejecutada: IORWF 0x20,0
Después de la instrucción: W=0x73
f(0x20)=0x13

T-4.2.2.10 Mover un registro (MOVF)

Mueve el contenido presente en la posición de memoria del área de datos indicada. El destino
puede ser el propio registro o el registro W. En este caso se dice que la instrucción sirve para cargar W.

MOVF Mover el registro f


Sintaxis MOVF f,d
Operandos f es la dirección de un registro RAM entre 0 y 127
d es el destino del resultado: 0=W, 1=registro
Operación (f)  (destino)
Bits de estado Z
Descripción Mueve el valor del registro f. Si d=0 el valor se carga
en W. Si d=1 el valor se queda en el propio registro f.
Este destino sobre sí mismo permite conocer si el
valor actual del registro es igual a 0x00.
Ejemplo Antes de la instrucción: f(0x20) = 0x13
Instrucción ejecutada: MOVF 0x20,0
Después de la instrucción: f(0x20)=0x13
W=0x13

T-4.2.2.11 Guardar el registro W (MOVWF)

Almacena o guarda el valor actual del registro W sobre la posición de memoria del área de datos
indicada.

MOVWF Guardar el W en el registro f


Sintaxis MOVWF f
Operando f es la dirección de un registro RAM entre 0 y 127
Operación (W)  (f)
Bits de estado Ninguno
Descripción Almacena el valor actual del registro W sobre la
dirección f
Ejemplo Antes de la instrucción: f(0x20)=0xB7
Instrucción ejecutada: MOVLW 0x33
MOVWF 0x20
Después de la instrucción: f(0x20)=0x33

T-4.2.2.12 Rotación a la izquierda (RLF)

Rotación a la izquierda de los bits contenidos en la posición de memoria del área de datos indicada.

RLF Rotación izquierda a través de C


Sintaxis RLF f,d
Operandos f es la dirección de un registro RAM entre 0 y 127
d es el destino del resultado: 0=W, 1=registro
Operación

4-17
www.mkelectronica.com Microcontroladores PIC: Nivel I
Bits de estado C
Descripción El contenido del registro f se desplaza una posición
hacia la izquierda a través del bit carry. Si d=0 el
resultado se queda en W. Si d=1 el resultado se queda
en el propio registro f
Ejemplo Antes de la instrucción: f(0x20) = 0xE6 = 11100110
C=0
Instrucción ejecutada: RLF 0x20,0
Después de la instrucción: f(0x20) = 0xE6 = 11100110
W=0xCC = 11001100
C=1

T-4.2.2.13 Rotación a la derecha

Rotación a la derecha de los bits contenidos en la posición de memoria del área de datos indicada.

RRF Rotación derecha a través de C


Sintaxis RRF f,d
Operandos f es la dirección de un registro RAM entre 0 y 127
d es el destino del resultado: 0=W, 1=registro
Operación

Bits de estado C
Descripción El contenido del registro f se desplaza una posición
hacia la derecha a través del bit carry. Si d=0 el
resultado se queda en W. Si d=1 el resultado se queda
en el propio registro f
Ejemplo Antes de la instrucción: f(0x20) = 0xE6 = 11100110
C=0
Instrucción ejecutada: RRF 0x20,0
Después de la instrucción: f(0x20) = 0xE6 = 11100110
W=0x73 = 01110011
C=0

T-4.2.2.14 Restar (SUBWF)

Resta, al valor actual que haya en la posición del área de datos indicada, el valor actual del registro
W.

SUBWF Restar a f el contenido de W


Sintaxis SUBWF f,d
Operandos f es la dirección de un registro RAM entre 0 y 127
d es el destino del resultado: 0=W, 1=registro
Operación (f) - (W)  (destino)
Bits de estado C,DC,Z
Descripción Resta al contenido del registro f el valor de W. Si d=0
el resultado se queda en W. Si d=1 el resultado se
queda en el propio registro f. C=0 si W>f, C=1 si W≤f,
DC=0 si W<3:0> > f<3:0> y DC=1 si W<3:0>≤ f<3:0>
Ejemplo Antes de la instrucción: W=0x07
f(0x20) = 0x03
Instrucción ejecutada: SUBWF 0x20,0
Después de la instrucción: f(0x20) = 0x03
W=0xFC
C=0, DC=0 y Z=0

4-18
www.mkelectronica.com Microcontroladores PIC: Nivel I
T-4.2.2.15 Intercambio (SWAPF)

Intercambia los 4 bits de menos peso del contenido de la posición del área de datos indicada, con
sus 4 bits de más peso.

SWAPF Intercambio de los nibbles de f


Sintaxis SWAPF f,d
Operandos f es la dirección de un registro RAM entre 0 y 127
d es el destino del resultado: 0=W, 1=registro
Operación (f<3:0>)  (Destino <7:4>)
(f<7:4>)  (Destino <3:0>)
Bits de estado Ninguno
Descripción Los cuatro bits (nibble) de menos peso de f se
intercambian con los cuatro bits de más peso. Si d=0
el resultado se queda en W. Si d=1 el resultado se
queda en el propio registro f.
Ejemplo Antes de la instrucción: f(0x20) = 0x48
Instrucción ejecutada: SWAPF 0x20,0
Después de la instrucción: W=0x84
F(0x20) = 0x48

T-4.2.2.16 Función OR exclusiva (XORWF)

Realiza la función OR exclusiva (XOR), bit a bit, entre el contenido actual del registro W y el
contenido de la posición de memoria del área de datos indicada.

XORWF Función XOR entre W y el registro f


Sintaxis XORWF f,d
Operandos f es la dirección de un registro RAM entre 0 y 127
d es el destino del resultado: 0=W, 1=registro
Operación (W) .XOR. (f)  (destino)
Bits de estado Z
Descripción Realiza la función lógica XOR entre el contenido de
W y el del registro f. Si d=0 el resultado se queda en
W. Si d=1 el resultado se queda en el propio registro
f
Ejemplo Antes de la instrucción: W=0x60
f(0x20) = 0x13
Instrucción ejecutada: XORWF 0x20,1
Después de la instrucción: W=0x60
f(0x20)=0x73

T-4.2.3 Instrucciones orientadas al bit

Únicamente hay cuatro instrucciones de este tipo. Permiten chequear o manipular, a nivel individual,
cualquier bit de cualquier registro del área de memoria RAM de datos.

Bit 13 Bit 10 Bit 9 Bit 7 Bit 6 Bit 0


OP CODE b f

OP CODE: Bits<13:10> Cuatro bits que representan al código de la propia instrucción.


b: Bits<9:7> Tres bits que seleccionan cuál de los 8 bits (del 0 al 7) se va a manipular.
f: Bits<6:0> 7 bits que indican la dirección del área de datos donde se encuentra el registro
7
que contiene el bit a manipular. Esa dirección está comprendida entre 0x00 y 0x7F (2 =128).

Atención: Debes asegurarte de seleccionar previamente el banco apropiado mediante los bits RP1 y
RP0 del registro STATUS.

4-19
www.mkelectronica.com Microcontroladores PIC: Nivel I
T-4.2.3.1 Borrar un bit (BCF)

Borra el bit deseado de la posición de memoria del área de datos indicada.

BCF Borrar un bit del registro f


Sintaxis BCF f,b
Operandos f es la dirección de un registro RAM entre 0 y 127
b es el nº de bit a borrar entre 0 y 7
Operación 0  (f<b>)
Bits de estado Ninguno
Descripción Pone a “0” el bit b del registro f
Ejemplo Antes de la instrucción: f(0x20) = 0x0F = 00001111
Instrucción ejecutada: BCF 0x20,1
Después de la instrucción: f(0x20) = 0x0D = 00001101

T-4.2.3.2 Activar un bit (BSF)

Activa el bit deseado de la posición de memoria del área de datos indicada.

BSF Activar un bit del registro f


Sintaxis BSF f,b
Operandos f es la dirección de un registro RAM entre 0 y 127
b es el nº de bit a activar entre 0 y 7
Operación 0  (f<b>)
Bits de estado Ninguno
Descripción Pone a “1” el bit b del registro f
Ejemplo Antes de la instrucción: f(0x20) = 0x0F = 00001111
Instrucción ejecutada: BSF 0x20,7
Después de la instrucción: f(0x20) = 0x8F = 10001111

T-4.2.3.3 Chequear si un bit está borrado (BTFSC)

Chequea el estado del bit deseado en la posición de memoria del área de datos indicada. Si ese bit
está a nivel “0” el contador de programa PC se desplaza una instrucción (salta una instrucción). Si el bit está
a nivel “1” el PC no salta y sigue su curso.

BTFSC Chequea el bit b del registro f y salta si es “0”


Sintaxis BTFSC f,b
Operandos f es la dirección de un registro RAM entre 0 y 127
b es el nº de bit a chequear entre 0 y 7
Operación Salto si (f<b>) es igual a “0”
Bits de estado Ninguno
Descripción Si el bit b del registro f es igual a “0”, el PC se
incrementa en una unidad (salta una posición)
Ejemplo Antes de la instrucción: f(0x20) = 0x0F = 00001111
Instrucción ejecutada: BTFSC 0x20,6
Después de la instrucción: PC=PC+1

T-4.2.3.4 Chequear si un bit está activado (BTFSS)

Chequea el estado del bit deseado en la posición de memoria del área de datos indicada. Si ese bit
está a nivel “1” el contador de programa PC se desplaza una instrucción (salta una instrucción). Si el bit está
a nivel “0” el PC no salta y sigue su curso.

BTFSS Chequea el bit b del registro f y salta si es “1”


Sintaxis BTFSS f,b
Operandos f es la dirección de un registro RAM entre 0 y 127
b es el nº de bit a chequear entre 0 y 7

4-20
www.mkelectronica.com Microcontroladores PIC: Nivel I
Operación Salto si (f<b>) es igual a “1”
Bits de estado Ninguno
Descripción Si el bit b del registro f es igual a “1”, el PC se
incrementa en una unidad (salta una posición)
Ejemplo Antes de la instrucción: f(0x20) = 0x0F = 00001111
Instrucción ejecutada: BTFSS 0x20,2
Después de la instrucción: PC=PC+1

T-4.2.4 Instrucciones de control

Instrucciones de propósito general. Algunas de ellas controlan ciertas tareas específicas propias del
controlador. Son las últimas siete instrucciones a estudiar.

T-4.2.4.1 Borrar el registro W

Borra el contenido del registro W

CLRW Borrar el registro W


Sintaxis CLRW
Operando Ninguno
Operación 0x00  W
1Z
Bits de estado Z
Descripción Se borran todos los bits del registro W y el bit Z del
registro STATUS se pone a “1”
Ejemplo Antes de la instrucción: W=0x55
Z=0
Instrucción ejecutada: CLRW
Después de la instrucción: W=0x00
Z=1

T-4.2.4.2 Refrescar el WDT (CLRWDT)

Cada vez que se ejecuta esta instrucción el temporizador/supervisor WDT se refresca y reinicia una
nueva temporización. Se debe procurar que esto ocurra antes del que el WDT se desborde y provoque un
RESET del sistema.

CLRWDT Borrar el supervisor WDT


Sintaxis CLRWDT
Operando Ninguno
Operación 0x00  WDT
0  preescaler del WDT
1  /TO
1  /PD
Bits de estado /TO,/PD
Descripción Borra e inicia el temporizador WDT también conocido
como supervisor o “perro guardián”. El preescaler
asociado al WDT también es reiniciado y los bits /TO
y /PD del STATUS son activados.
Ejemplo Antes de la instrucción: /TO,/PD= xx
Instrucción ejecutada: CLRWDT
Después de la instrucción: /TO = /PD = 1

T-4.2.4.3 No operar (NOP)

Instrucción que precisamente sirve para no hacer nada. Consume un ciclo de instrucción que, en
función de la frecuencia con la que trabaja el sistema, se traduce en un consumo o pérdida de tiempo.

4-21
www.mkelectronica.com Microcontroladores PIC: Nivel I
NOP No operar
Sintaxis NOP
Operando Ninguno
Operación Ninguna
Bits de estado Ninguno
Descripción Esta instrucción no hace nada, consume un ciclo de
ejecución
Ejemplo Instrucción ejecutada: NOP

T-4.2.4.4 Retorno de interrupción (RETFIE)

Cada vez que algún periférico provoca una interrupción del sistema el controlador deja de ejecutar
el programa principal actual y pasa a ejecutar un programa que da servicio a esa interrupción. El valor del
PC en ese instante se guarda en la memoria de stack. Cuando el servicio finaliza, gracias a esta instrucción,
el controlador puede retornar al programa principal, en el punto donde se dejó, recuperando el valor del PC
que se guardó en la memoria stack.

RETFIE Retorno desde interrupción


Sintaxis RETFIE
Operando Ninguno
Operación TOS  PC
1  GIE
Bits de estado Ninguno
Descripción Esta instrucción recupera desde la memoria de stack
(TOS) el valor del PC que se salvó cuando se
produjo la interrupción. De esta manera se retorna a
la ejecución en el punto de origen donde se dejó. El
bit GIE de habilitación de interrupciones se pone a
“1”. Consume dos ciclos de ejecución.
Ejemplo Instrucción ejecutada: RETFIE
Después de la instrucción: TOS  PC
1  GIE

T-4.2.4.5 Retorno de subrutina (RETLW)

Retorna al programa principal desde una subrutina o función. La instrucción recupera desde la
memoria de stack, el valor del PC que se guardó cuando se produjo el salto a la subrutina mediante la
instrucción CALL. Esta instrucción también devuelve en el registro W el valor inmediato que se indique.

RETLW Retorno de subrutina con valor en W


Sintaxis RETLW k
Operando k es un valor inmediato de 8 bits entre 0 y 255
Operación k  (W)
TOS  PC
Bits de estado Ninguno
Descripción El registro W se carga con el dato inmediato k. Se
recupera desde la memoria de stack (TOS) el valor
del PC que se salvó en el salto a subrutina. De esta
manera se retorna a la ejecución en el punto de
origen donde se dejó. Consume dos ciclos de
ejecución.
Ejemplo Antes de Ia instrucción: W=0x24
instrucción ejecutada: RETLW 0x33
Después de la instrucción: TOS  PC
W=0x33

4-22
www.mkelectronica.com Microcontroladores PIC: Nivel I
T-4.2.4.6 Retorno de subrutina (RETURN)

Retorna al programa principal desde una subrutina o función. La instrucción recupera desde la
memoria de stack, el valor del PC que se guardó cuando se produjo el salto a la subrutina mediante la
instrucción CALL.

RETURN Retorno de subrutina


Sintaxis RETURN
Operando Ninguno
Operación TOS  PC
Bits de estado Ninguno
Descripción Se recupera desde la memoria de stack (TOS) el
valor del PC que se salvó en el salto a subrutina. De
esta manera se retorna a la ejecución en el punto de
origen donde se dejó. Consume dos ciclos de
ejecución.
Ejemplo Instrucción ejecutada: RETURN
Después de la instrucción: TOS  PC

T-4.2.4.7 Modo de bajo consumo (SLEEP)

Cada vez que se ejecuta esta instrucción el controlador entra en el modo de bajo consumo. El
oscilador principal se para, el núcleo deja de ejecutar instrucciones y el sistema se detiene. Para “despertar”
y salir del modo de bajo consumo basta con que se produzca una interrupción o una situación de RESET en
cualquiera de las múltiples formas.

SLEEP Modo standby de bajo consumo


Sintaxis SLEEP
Operando Ninguno
Operación 0x00  WDT
0  preescaler del WDT
1  /TO
0  /PD
Bits de estado /TO, /PD
Descripción El oscilador principal queda detenido y el controlador
pasa al modo standby de bajo consumo. Tanto el
WDT como su preescaler se reinician a 0x00 y los
bits /TO y /PD se ponen a “1” y “0” respectivamente.
Ejemplo Instrucción ejecutada: SLEEP

4-23
www.mkelectronica.com Microcontroladores PIC: Nivel I
4-24
www.mkelectronica.com Microcontroladores PIC: Nivel I
AREA DE PRÁCTICAS

Ahora se van a proponer una serie de ejemplos didácticos con el objetivo de utilizar un buen número
de las instrucciones estudiadas en el área de teoría, así como los diferentes modos de direccionamiento. Te
recuerdo los pasos que debes de seguir y que ya empleaste en la Unidad 3 anterior:

1. Editar el programa fuente. Aunque te los puedes descargar, es muy aconsejable que edites los
ejemplos para hacer modificaciones, mejoras, etc…
2. Crear el proyecto.
3. Ensamblar el programa fuente para obtener el programa máquina o ejecutable.
4. Depurar y poner a punto el programa.

De momento en la depuración vas a utilizar también el simulador software que se incluye en el


MPLAB-IDE. Más adelante, en las siguientes unidades, emplearás el depurador hardware que se incluye en
el laboratorio de prácticas USB-PIC’School.

Desde el material complementario de esta unidad te puedes descargar los programas fuentes
correspondientes a los ejemplos de esta Unidad 4. Hazlo.

P-4.1 Ejemplo 4-1: Direccionamiento directo

En este ejemplo vas a realizar operaciones con datos variables en lugar de constantes o inmediatos
como los que hiciste en la anterior Unidad 3. Esos datos se suponen almacenados en la memoria RAM del
área de datos y emplearás el direccionamiento directo para acceder a los mismos.

P-4.1.1 Descripción / edición del programa fuente

Lo tienes en el fichero “Ejemplo 4-1.asm”. Para empezar, el ejemplo utiliza dos nuevas directivas del
ensamblador: “cblock” y “endc”. Te serán muy útiles para declarar variables en memoria RAM del área de
datos, y asignarles nombres o etiquetas.

cblock 0x20 ;Reserva de variables a partir de 0x20


Dato_A ;Variable para el dato A
Dato_B ;Variable para el dato B
Resultado ;Variable para el resultado
endc

“cblock 0x20” establece la dirección inicial deseada del área


RAM de datos. A todas las etiquetas incluidas entre “cblock 0x20” y
“endc” se les asigna automáticamente direcciones consecutivas a partir
de esa dirección inicial. En el ejemplo, a la variable “Dato_A”, se le
asigna la dirección 0x20, a “Dato_B” la dirección 0x21 y a “Resultado” la
dirección 0x22. Mira la figura.

Puedes poner tantos “cblock … endc” como quieras, pero


procura que la dirección inicial de cada uno de ellos se corresponda con
posiciones disponibles para el usuario dentro de la RAM del área de
datos. Que no estén ocupadas por los registros especiales SFR. En el
caso del PIC16F886 la primera posición disponible es precisamente la
0x20 del banco 0 (consulta la figura de la página 2-19).

4-25
www.mkelectronica.com Microcontroladores PIC: Nivel I
El cuerpo del programa presenta un aspecto algo parecido al del Ejemplo 3-1 de la Unidad anterior.
La gran diferencia es que en aquella ocasión se empleaba direccionamiento inmediato, se sumaba 12 + 24.
Ahora empleamos direccionamiento directo. Se suma lo que haya en “Dato_A” (posición 0x20) con lo que
haya en “Dato_B” (posición 0x21). Se supone que esas posiciones estarán previamente cargadas con algún
valor útil. El resultado se almacena en la variable “Resultado” (posición 0x22). ¿Notas la diferencia?

Estudia las instrucciones que forman el programa. Se han empleado dos nuevas: “movf Dato_A,0”
carga el registro W con el contenido de la posición 0x20, y “addwf Dato_B,0” suma al registro W el
contenido de la posición 0x21. El resultado de la suma se queda en el acumulador. Las otras dos
instrucciones ya las usaste en los ejemplos de la Unidad 3 anterior.

Inicio movf Dato_A,0 ;Carga en W el 1er. sumando


addwf Dato_B,0 ;Suma el 2º sumando. Resultado en W
movwf Resultado ;Guarda el resultado

Fin goto Fin ;Bucle infinito

P-4.1.2 Proyecto y ensamblado

Puedes empezar repasando la Unidad 3 anterior. Mediante el asistente Project  Wizard creas un
nuevo proyecto. Te recomiendo que lo llames “Ejemplo 4-1.mcp”. Seguidamente, mediante Project  Make
o la tecla F10, lo ensamblas. Asegúrate de que no hay errores.

Ahora es un buen momento para configurar tu entorno de trabajo y abrir las ventanas que
consideres oportuno. Te sugiero:

1. Tener abierto el programa fuente “Ejemplo 4-1.asm”


2. Tener abierta la ventana de salida: View  Output
3. Seleccionar la herramienta de depuración: Debugger  Select Tool  MPLAB SIM
4. Abrir la ventana de la memoria RAM: View  File Registers
5. Abrir la ventana de control de tiempos: Debugger  StopWatch
6. Abrir la ventana de las variables: View  Watch

7. En la ventana Watch indicar qué registros y


variables deseas visualizar, así como el sistema de
numeración que prefieras. Mira la figura de ejemplo.
El PCL se visualiza en hexadecimal, STATUS en
binario y el resto de variables en decimal.

8. Desconecta el WDT: Configure  Configuration


Bits
9. No te olvides de salvar el proyecto con todo tu entorno de trabajo: Project  Save Project

P-4.1.3 Ejecución/depuración

Antes de empezar no te olvides de cargar las variables “Dato_A” y “Dato_B” con los valores que
deseas sumar. Lo puedes hacer directamente en la ventana Watch de la figura anterior. Basta con
seleccionar cada variable y teclear directamente el valor en el mismo sistema de numeración que con que lo
estás visualizando. Esto lo debes hacer cada vez que quieras ejecutar el programa.

Consulta el área de prácticas de la Unidad 3 anterior y recuerda que:

4-26
www.mkelectronica.com Microcontroladores PIC: Nivel I
1. Cada vez que quieras realizar una nueva ejecución, pulsa el
botón RESET para que se empiece desde la primera
instrucción. Aprovecha ahora para cambiar los valores con
los que deseas operar, en la ventana Watch (variables
“Dato_A” y “Dato_B”).

2. Por motivos didácticos te recomiendo que empieces ejecutando paso a paso (Step Into). Así verás
y aprenderás cómo va evolucionando cada instrucción.

3. Prueba y experimenta con los puntos de parada o “Breakpoints”.

4. Prueba también a ejecutar en tiempo real con el botón Run. La ejecución se detiene al pulsar el
botón Halt.

En este ejemplo estás empleando el direccionamiento directo. Puedes obtener distintos resultados
SIN modificar el programa. Basta con que modifiques el valor de las variables implicadas (visualizadas en la
ventana Watch), antes de iniciar una nueva ejecución (RESET).

P-4.1.4 Ahora tú

Basándonos en el “Ejemplo 4-1.asm” te voy a proponer una serie de modificaciones con objeto de
que puedas experimentar con diferentes instrucciones y resultados.

Sumas

Deja el programa tal y como está. Se trata


simplemente de que varíes los datos para obtener Dato_A Dato_B Resultado Z DC C
diferentes resultados. Para ello modifica los valores 24 86
(en decimal) de las variables “Dato_A” y “Dato_B” en 128 128
210 75
la ventana Watch. Ejecutas desde el principio
90 110
(RESET) para cada caso y analiza los diferentes
0 0
resultados completando la siguiente tabla. 63 120

Restas

Modifica el programa cambiando la instrucción de sumar (addwf) por la de restar (subwf) también
con direccionamiento directo. Recuerda que:

 Cada modificación del programa requiere de un nuevo ensamblado.


 En las instrucciones de restar el operando
que indiques actúa como minuendo y el Dato_A Dato_B Resultado Z DC C
contenido de registro W como substraendo. 24 86
Es de decir, Resultado = Dato_B – Dato_A. 128 128
210 75
 En las restas, los bits C y DC del registro de
90 110
STATUS, están complementados. Es decir si 0 0
NO hay llevada se quedan a nivel “1” y SI 63 120
hay llevada se quedan a nivel “0”.

Funciones lógicas básicas

Vas a usar nuevas instrucciones. En esta ocasión,


empleando las instrucciones ”andwf”, “iorwf” y “xorwf”,
realizarás las funciones lógicas AND, OR y XOR entre los
contenidos de las variables “Dato_A” y “Dato_B”.

4-27
www.mkelectronica.com Microcontroladores PIC: Nivel I
Las funciones lógicas se realizan bit a bit entre los dos operandos, es decir, el bit de menos peso, el
bit 0, del “Dato_A” con el de menos peso del “Dato_B”, el bit 1 con el 1, el 2 con el 2 y así sucesivamente.
Repasa y revisa tus conocimientos en electrónica digital para comprobar el funcionamiento de las diferentes
funciones lógicas.

Basta con que sustituyas, en el mismo programa fuente “Ejemplo 4-1.asm”, la instrucción anterior de
restar (subwf) por las instrucciones “andwf”, “iorwf” y “xorwf” para cada caso. Recuerda que:

 Cada vez que modificas el programa fuente, lo debes volver a ensamblar (F10).
 Si únicamente modificas los datos en las variables “Dato_A” y “Dato_B”, no es necesario ensamblar
el programa.
 En este ejemplo te sugiero que las variables “Dato_A”, “Dato_B” y “Resultado” las visualices en
binario. Haz los ajustes oportunos en la ventana Watch.
 Reinicia cada ejecución de cada caso desde el principio del programa mediante RESET.
 Didácticamente hablando es muy interesante que la ejecución la hagas paso a paso (Step Into)
para descubrir el funcionamiento de cada instrucción.
 Posteriormente, si quieres, puedes emplear los breakpoints y/o la ejecución en tiempo real (Run).
 En las funciones lógicas el único bit del registro de STATUS que puede verse modificado es el bit Z.

Completa la siguiente tabla con las diferentes funciones lógicas para los diferentes valores de las
variables “Dato_A” y “Dato_B”.

Dato_A Dato_B AND Z OR Z XOR Z


10100011 00001100
10101010 01010101
11111111 00001111
00000000 11110000
11000011 11110011
00000001 01010101

Funciones lógicas derivadas

Echando mano de tus conocimientos en electrónica digital sabrás que, a partir de las funciones
lógicas básicas, se pueden obtener sus complementarias: NO-AND (NAND), NO-OR (NOR) y NO-XOR
(XNOR). Para implementarlas mediante un programa te basta con utilizar una nueva instrucción:
complementar o realizar la función NO con el valor de un registro (comf). Observa el siguiente programa de
ejemplo:

Inicio movf Dato_A,0 ;Carga en W el 1er. valor


andwf Dato_B,0 ;Realiza la función AND con el 2º valor. Resultado en W
movwf Resultado ;Guarda el resultado (AND)
comf Resultado,1 ;Complementa el resultado (NAND)

Las dos primeras instrucciones realizan la función AND, bit a bit, entre los valores que hay en las
variables “Dato_A” y “Dato_B”. El resultado queda en W. La tercera instrucción guarda ese resultado en la
variable “Resultado”. Hasta aquí no hay nada nuevo.

La cuarta instrucción, “comf Resultado ,1”, complementa el contenido de la variable “Resultado”.


Cambia los niveles “0” por niveles “1” y viceversa y el resultado queda en la MISMA variable (,1).

A partir de esto, haz las modificaciones necesarias para completar nuevamente la siguiente tabla.

4-28
www.mkelectronica.com Microcontroladores PIC: Nivel I
Dato_A Dato_B NAND Z NOR Z XNOR Z
10100011 00001100
10101010 01010101
11111111 00001111
00000000 11110000
11000011 11110011
00000001 01010101

P-4.2 Ejemplo 4-2: Direccionamiento indirecto

La mejor forma de entender el direccionamiento directo es mediante un ejemplo. Supón que


necesitas rellenar un área de la memoria RAM de datos con un mismo valor, por ejemplo el 0x33. El área
está comprendida entre las posiciones 0x30 y 0x3F, en total 16 posiciones. Al área de memoria también se
le suele conocer como “Buffer”. Tras la ejecución del programa el buffer debiera quedar como se muestra en
la figura.

Con los conocimientos que tienes actualmente debieras ser capaz de resolverlo. Mira el siguiente
programa de ejemplo:

movlw 0x33 ;Carga inmediata en W del valor de relleno (0x33)


movwf 0x30 ;Almacenar en la posición 0x30 de la RAM de datos
movwf 0x31 ;Almacena en la siguiente posición (0x31)
movwf 0x32 ;Almacena en la siguiente posición (0x32)
---------------
---------------
movwf 0x3F ;Almacenar en la última posición (0x3F)

Fácil ¿no? Ahora bien, ¿te parece un programa eficiente? Si te pones a contar verás que emplea un
total de 17 instrucciones, una para cargar el W y otras 16 para almacenarlo en otras tantas posiciones de la
memoria o buffer. ¿Y si necesitas rellenar un buffer de 100 posiciones? ¿Emplearías 101 instrucciones?

Evidentemente habrá alguna solución, y esta pasa por emplear el


direccionamiento indirecto. En la figura tienes un esquema que recibe el nombre de
“organigrama”. De forma gráfica simboliza lo que luego tendrás que traducir a
instrucciones. Facilita la comprensión del programa:

1. Inicia la variable “Contador” con el número de posiciones a rellenar (16).


2. Inicia un registro índice con la posición de relleno inicial (0x30).
3. Carga en W el valor de relleno (0x33).
4. Lo guarda en la posición que indica el registro índice (inicialmente la 0x30).
5. Incremente el valor del registro índice (ahora apunta a la siguiente dirección, la
0x31).
6. Decrementa el valor del contador. Se inició con 16 por lo que ahora valdrá 15.
7. Interrogamos si ése contador ha llegado a 0. Si no ha llegado repite el bucle
desde el paso 3.
8. Cuando el contador llega a 0 el programa finaliza, el relleno se ha completado.

4-29
www.mkelectronica.com Microcontroladores PIC: Nivel I
P-4.2.1 Descripción / edición del programa fuente

Hay algunas novedades:

include "P16F886.INC" ;Definiciones de registros internos

La directiva “include” incrusta o “pega” en tu programa fuente otro fichero de tipo texto cuyo
contenido puede ser una declaración de etiquetas o variables, otro programa fuente, librerías, etc… En este
caso se incrusta un fichero, el “P16F886.INC”, que contiene la declaración de etiquetas de todos y cada uno
de los registros especiales (SFR) del PIC16F886, así como de todos sus bits. Lo suministra Microchip
cuando se instala el MPLAB-IDE y lo puedes abrir, editar y modificar a tu gusto, aunque no te lo aconsejo.

¿Te imaginas tener que definir a todos ellos escribiendo “Reg equ dir” como has hecho con las
variables del ejemplo anterior? Además, lo tendrías que hacer en todos los programas en los que quieras
usar a esos registros SFR (y sus bits) ¡¡ y hay nada más y nada menos que 94 !! Una vez que incluyes este
fichero en tu programa fuente, puedes utilizar expresiones como:

movlw 0x30
movwf FSR ;Cargar 0x30 en el registro índice FSR
bcf STATUS,Z ;Borrar el bit Z del registro STATUS
movf PORTA,W ;Cargar en el registro W el contenido del puerto A
movwf INDF ;Guardar W en la posición indicada por el registro índice

Que sería 100% equivalente a esto otro sino lo incluyeras:

movlw 0x30
movwf 0x04 ;Cargar 0x30 en el registro índice FSR
bcf 0x03,2 ;Borrar el bit Z del registro STATUS
movf 0x05,0 ;Cargar en el registro W el contenido del puerto A
movwf 0x00 ;Guardar W en la posición indicada por el registro índice

¿Con qué te quedas? ¿Cuál te parece más cómodo? ¿Y más legible? Pues… tú mismo.

Aquí tienes la declaración de tus variables que vas a emplear en tu programa. Esto ya lo conoces
del ejemplo anterior. La variable “Valor” está en la posición 0x20 y “Contador” en la 0x21.

cblock 0x20 ;Reserva de variables a partir de 0x20


Valor ;Valor de relleno
Contador ;Nº de posiciones a rellenar
endc

Ahora vamos con el resto del programa fuente contenido en el fichero “Ejemplo 4-2.asm”

Inicio movlw .16


movwf Contador ;El contador se carga con el nº de bytes a rellenar
movlw 0x30
movwf FSR ;Inicia el registro índice con 1ª dirección a rellenar

Loop_1 movf Valor,W ;Carga en W el valor de relleno


movwf INDF ;Lo almacena en el buffer
incf FSR,F ;Siguiente dirección del buffer
decfsz Contador ;Es el último byte a rellenar ??
goto Loop_1 ;No, siguiente byte

Fin goto Fin ;Si. Bucle infinito

4-30
www.mkelectronica.com Microcontroladores PIC: Nivel I
Si lo estudias con atención verás que sigue fielmente el organigrama de la anterior figura:

1. Tras el RESET, en Inicio, se carga la variable “Contador” con el valor 16. Es el número de
posiciones a rellenar.
2. El registro especial FSR se carga con 0x30. Este registro es el índice que se emplea en el
direccionamiento indirecto. Contiene la primera dirección del buffer a rellenar (0x30)
3. A continuación, “Loop _1 movf Valor,W”, carga en W el valor de relleno. Este lo debes meter
previamente en tu variable “Valor” que está definida como la dirección 0x20 del área RAM de datos.
4. Mediante “movwf INDF” ese valor en W se almacena en la posición que en ese momento indica el
registro índice FSR.
5. “incf FSR,F” incrementa en una unidad el valor del registro índice FSR. Este apuntará por tanto a la
siguiente dirección del buffer.
6. “decfsz Contador” decrementa en una unidad la variable “Contador”. Si el resultado es distinto de 0
se ejecuta la instrucción “goto Loop_1”. La ejecución se repite desde el paso nº 3.
7. Si el resultado de decrementar la variable “Contador” es igual a 0, el controlador se pasa de largo la
instrucción “goto Loop_1” y ejecuta la instrucción “Fin goto fin”, quedando en un bucle infinito. El
programa ha finalizado.

P-4.2.2 Creación del proyecto y ensamblado

Mediante el asistente Project  Project Wizard crea un nuevo proyecto. Insisto en recomendarte
que le asignes el mismo nombre que el programa fuente: “Ejemplo 4-2.mcp”. Ensámblalo mediante F10 y
vete creando tu entorno de trabajo. Selecciona el simulador mediante Debugger  Debugger Tool 
MPLAB SIM. Yo te sugiero el que puedes ver en la siguiente figura. No te olvides de salvarlo mediante
Project  Save Project.

La ventana Sopwatch se ha ajusta a una velocidad simulada de trabajo de 4 MHz. Esto lo puedes
hacer mediante Debugger  Settings  Osc/Trace. Así sabes que cada instrucción ejecutada consume 1
ciclo que es igual a 1 µS de duración, excepto los saltos, que consumen 2.

4-31
www.mkelectronica.com Microcontroladores PIC: Nivel I
En la ventana Watch indicamos los registros y variables que queremos visualizar. A mí me parece
que para hacer un buen análisis del funcionamiento del programa, debieras sacar al: PCL, FSR, WREG,
Valor y Contador. Este último lo estoy visualizando en decimal… como quieras.

Por último no te olvides, antes de empezar a ejecutar, de desconectar el WDT (si no lo estuviera
ya). Lo debes hacer mediante Configure  Configuration Bits.

P-4.2.3 Ejecución / depuración

No te olvides de cargar en la variable “Valor” el valor de relleno 0x33 (o cualquier otro).

Como siempre, te recomiendo que empieces ejecutando el programa paso a paso (Step Into). Si
prestas atención a cada instrucción que vas ejecutando, puedes aprender mucho sobre cómo funciona cada
una de ellas y sobre cómo funciona el conjunto del programa. Merece la pena que te fijes en:

 Cómo evoluciona el PCL en cada vuelta o bucle.


 El tiempo de ejecución que va transcurriendo (ventana Stopwatch). Todas las instrucciones
consumen 1 ciclo (1 µS), excepto los saltos, cuando los haya, que consumen 2.
 Cómo se van modificando el registro FSR y la variable “Contador”.
 El funcionamiento de la instrucción “decfsz Contador”.
 Que en la ventana File Refgisters, a partir de la dirección 0x30, se va guardando
secuencialmente el valor de relleno (0x33).

Luego ya puedes experimentar con los breakpoints y la ejecución en tiempo real (Run). En cualquier
caso el resultado final debiera dejar el valor 0x33 almacenado en todas las posiciones del área RAM de
datos comprendidas entre las direcciones 0x30 y 0x3F ambas incluidas. Mira la figura.

P-4.2.4 Ahora tú

En base al ejemplo contesta a las siguientes preguntas:

1. Cuánto tiempo tardan en ejecutarse las instrucciones necesarias para rellenar únicamente las
posiciones 0x30 y 0x31 del buffer? _________________________

2. ¿Cuánto tiempo tarda en ejecutarse la totalidad del programa? ______________

3. Si deseas que el valor de relleno sea 0xAA ¿qué debieras hacer? __________________________
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________

4. Para rellenar un buffer que empieza en la posición 0x40 y finaliza en la posición 0x70 (ambas
incluidas) ¿Qué modificaciones debieras hacer? ________________________________________

4-32
www.mkelectronica.com Microcontroladores PIC: Nivel I
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________

5. En este caso, ¿Cuál sería el tiempo total de ejecución? ___________________________________

P-4.3 Ejemplo 4-3: Temporizaciones

Una de las tareas más frecuentes en cualquier proyecto es realizar


pequeños programas cuya única función es consumir tiempo de ejecución sin
hacer nada útil. Reciben el nombre de tareas o rutinas de temporización
(“delays”). En este ejemplo vas a realizar una sencilla rutina de temporización
que consume 1000 µS (1 mS). A su vez esta rutina se ejecutará tantas veces
como indiques en una constante llamada “Tiempo”. El objetivo del ejemplo es
emplear nuevas instrucciones e introducirte en el manejo de las subrutinas.

P-4.3.1 Descripción / edición del programa fuente

En primer lugar vamos a estudiar la subrutina o función “Delay” encargada de realizar siempre una
misma tarea: temporizar 1000 µS (1 mS) sin hacer nada útil. Toda subrutina debe finalizar siempre con la
instrucción “return” para retornar al punto de origen en el programa principal que la llama.

;**************************************************************************
;Delay: Esta rutina genera una temporización de 999uS (0.999mS). ((249-1)*4)+3+4

Delay movlw .249 ;Carga .249 en W (consume 1uS)


movwf Del_1 ;Guarda en la variable Del_1 (consume 1uS)
Delay_1 nop ;No operar (consume 1uS)
decfsz Del_1,1 ;Decrementa en 1 a Del_1. Si no es 0 consume 1uS
goto Delay_1 ;No, repite (2uS)
return ;Si, fin (consume 2uS)

La subrutina comienza cargando la variable “Del_1” con el valor 249. Mediante la instrucción
“decfsz Del_1,1” la variable se decrementa en una unidad cada vez. Si el resultado del decremento es 0 se
salta una instrucción y se ejecuta “return”. Finaliza así la rutina y se retorna al programa principal. Si el
decremento es distinto de 0 se ejecuta la siguiente instrucción a “decfsz Del_1,1”, la “goto Delay_1”.

En resumidas cuentas, las instrucciones “nop” (no hacer nada), “decfsz Del_1,1” y “goto Delay_1”
forman un bucle que se ejecuta tantas veces como indique la variable “Del_1” – 1 (248). Como tardan en
ejecutarse 1, 1 y 2 µS respectivamente, el tiempo total consumido será de 992 µS (248 x 4). A este tiempo
hay que añadirle el que consumen las dos primeras instrucciones (2 µS), lo que consumen las instrucciones
del bucle en su último ciclo (3 µS) y lo que consume “return” (2 µS). Todo ello hace un total de 999 µS
(0.999 mS) consumidos en la ejecución de esta subrutina. Estamos suponiendo una velocidad de trabajo de
4 MHz cuyo ciclo de instrucción es de 1 µS.

Ahora echa un vistazo al cuerpo principal del programa. Su funcionamiento es bastante parecido a
la propia rutina.

;Programa principal
Inicio movlw Tiempo ;Carga tiempo total deseado (1uS)
movwf Del_2 ;Guarda en la variable Del_2 (1uS)
Loop_1 call Delay ;Temporiza 1001uS (999uS + 2uS de la propia call)
decfsz Del_2,1 ;Decrementa en 1 a Del_2. Si no es 0 consume 1uS
goto Loop_1 ;No, repite (2uS)

4-33
www.mkelectronica.com Microcontroladores PIC: Nivel I
goto Inicio ;Ejecutar de nuevo

Se empieza cargando la variable “Del_2” con el valor de la constante “Tiempo” que se ha definido al
principio del programa fuente con de 20 (“Tiempo equ .20”). Éste es el número de veces que se va a
ejecutar la rutina “Delay”, mediante la instrucción “Loop_1 call Delay”. Esta instrucción guarda en la
memoria de stack la dirección contenida en el PC y a la que hay que retornar, salta a la subrutina “Delay” y
ejecuta las instrucciones que contiene hasta la última, “return”. Ésta recupera del stack y devuelve el valor
original del PC, con lo que se retorna al programa principal.

Con las instrucciones “Loop_1 call Delay”, “decfsz Del_2,1” y “goto Loop_1” se forma un bucle
que ejecuta 20 veces la rutina “Delay” que, a su vez, temporiza 999 µ (1 mS). El tiempo total temporizado
será por tanto muy próximo a los 20 mS, transcurridos los cuales, mediante “goto Inicio”, el proceso se
vuelve a repetir.

P-4.3.2 Creación del proyecto y ensamblado

Mediante Project  Wizard creas el proyecto “Ejemplo 4-3.mcp” y al que asocias el programa
fuente “Ejemplo 4-3.asm”. Con el comando Project  Make (F10) lo ensamblas para obtener el
correspondiente programa ejecutable “Ejemplo 4-3.hex” junto con otros ficheros auxiliares.

Usa Debugger  Select Tool para seleccionar el simulador MPLAB SIM y Configure 
Configuration Bits para desactivar el WDT.

Ahora es el momento también de que abras las ventanas que consideres oportunas, y las coloques
en el área de trabajo como mejor te parezca. En esta ocasión opino que, junto a la ventana de Edición que
contiene el programa fuente, abras la ventana Output con los mensajes de salida y la ventana Watch
donde puedes visualizar/modificar los registros o variables empleadas. Abre también la ventana Stopwatch
mediante el comando Debugger  Stopwatch. Con ella puedes realizar la medida de los tiempos
consumidos según se ejecuta el programa. Recuerda que estamos hablando de tiempo simulado.

4-34
www.mkelectronica.com Microcontroladores PIC: Nivel I
Mediante Debugger  Settings puedes acceder a la ficha Osc/Trace donde simularás elegir la
velocidad de trabajo del controlador. El ejemplo está pensado para una velocidad de 4 MHz.

No te olvides de salvar el proyecto periódicamente mediante Project  Save Project y de cerrarlo


correctamente cuando acabes la sesión de trabajo mediante Project  Close.

P-4.3.3 Ejecución / depuración

Antes de realizar cualquier tipo de ejecución del programa no te olvides de poner a 0 el contador de
tiempo en la ventana Stopwatch.

Si ejecutas en tiempo real, mediante el comando Run, podrás detener la ejecución mediante el
comando Halt. El valor que tiene ahora ese contador, representa el tiempo de ejecución simulado.

Si ejecutas paso a paso, mediante Step Into, podrás ver exactamente la evolución del programa
conforme se van ejecutando sus instrucciones. Notarás que, cada vez que la ejecución entra en la
subrutina, te puedes eternizar hasta salir de ella. Date cuenta de que tienes que ejecutar paso a paso las
992 instrucciones que forman el bucle de la misma. ¡¡ Qué barbaridad !!

Ahora es un buen momento para emplear dos comandos de ejecución que no has tenido ocasión de
utilizar. Verás la importancia que tienen para ahorrar tiempo de depuración. El primero es el comando Step
Over. Si lo empleas justo en la instrucción de salto a la rutina de temporización “call Delay”, observarás que
ésta se ejecuta en tiempo real. El sistema se detiene justo en la
siguiente instrucción “decfsz Del_2,1”. Si ya sabes que una rutina
funciona correctamente, no tiene sentido tenerla que ejecutar paso a
paso cada vez que se haga uso de ella. Con Step Over la ejecutarás
directamente.

El segundo comando es Step OUT. Si has tenido la “mala suerte” de caer dentro de la subrutina,
con este comando puedes terminar su ejecución en tiempo real y detener el sistema una vez se ejecuta el
retorno de la misma, en “decfsz Del_2,1”.

El empleo de un punto de parada o “breakpoint” en la instrucción “goto Inicio” te permitirá detener


la ejecución en cuanto se termine de realizar la temporización total, tras los 20 mS (aprox.). Cada vez que
utilices el botón Run se realiza una nueva temporización. Utiliza el Stopwatch para hacer las medidas
oportunas de tiempo.

P-4.3.4 Ahora tú

Habrás observado que, cada vez que ejecutas el programa hasta el punto de
parada o breakpoint, se va acumulando un error en el tiempo medido por el
Stopwatch. Es todo un reto tratar de minimizar ese error, ¿te atreves?

La temporización se puede hacer todo lo grande que desees. La actual rutina


“Delay” emplea un único bucle que consiste en decrementar una variable hasta que
llegue a 0. Se pueden anidar varios bucles con varias variables para conseguir
tiempos mayores. Un bucle anidado es un bucle que envuelve a un segundo bucle
que, a su vez, puede envolver a un tercero, etc… Sugiero realizar una rutina de
temporización que sea capaz de temporizar 100000 µS (0.1 s). La figura te muestra
un organigrama con el esquema del trabajo a realizar.

4-35
www.mkelectronica.com Microcontroladores PIC: Nivel I
P-4.4 Ejemplo 4-4: Manipulación de bits

Con este sencillo ejemplo únicamente se pretende que


emplees las instrucciones de manipulación de bits. Se dice de
ellas que son instrucciones “orientadas al bit”. En el programa se
chequea el valor del bit 0 de la variable “Salida”. Si está a nivel
“0” se pone a nivel “1” y viceversa.

P-4.4.1 Descripción / edición del programa fuente

Echa un vistazo al programa fuente. Es muy sencillo.

;Programa principal
Inicio clrf Salida ;Puesta a 0 inicial
Loop btfsc Salida,0 ;Bit 0 de Salida = "0" ??
goto Loop_1 ;No
bsf Salida,0 ;Si, lo pone a "1"
goto Loop ;Repite el chequeo

Loop_1 bcf Salida,0 ;Lo pone a "0"


goto Loop ;Repite el chequeo

Una nueva instrucción, “clrf Salida”, que pone a 0, como punto de partida, la variable indicada. Otra
nueva instrucción, la “btfsc Salida,0”, comprueba si el bit 0 (el de menos peso) de la variable “Salida” está a
nivel lógico “0”. Si así fuera se salta la siguiente instrucción y continúa la ejecución en la instrucción “bsf
Salida,0” que activa el bit 0 de “Salida” y lo pone a “1”. Con “goto Loop” se vuelve a repetir el chequeo.

Si la comprobación del bit resulta falsa (porque está a “1”), no se salta ninguna instrucción y se
ejecuta “goto Loop_1”. Esto nos lleva a la instrucción “bcf Salida,0” que pone a “0” dicho bit. Con “goto
Loop” se vuelve a repetir el chequeo.

En resumidas cuentas, la ejecución de este ejemplo implica que el bit 0 de la variable “Salida” está
constantemente cambiando de nivel “0” a “1” y viceversa. Por último solo queda comentar que la instrucción
“btfss” es opuesta que la “btfsc” que hemos empleado. “btfss” chequea y se salta una instrucción en caso
de que el bit esté a nivel “1”.

P-4.4.2 Creación del proyecto y ensamblado

Mediante Project  Wizard crearás un proyecto llamado “Ejemplo 4-4.mcp”. Le asocias el


programa fuente “Ejemplo 4-4.asm”. Con el comando Project  Make (F10) lo ensamblamos para obtener
el correspondiente programa ejecutable “Ejemplo 4-4.hex” junto con otros ficheros auxiliares.

Usa Debugger  Select Tool para seleccionar el simulador MPLAB SIM y Configure 
Configuration Bits para desactivar el WDT. Ajusta la velocidad de simulación a 4MHz con el comando
Debugger  Settings y la ficha Osc/Trace.

Ahora es el momento también de abrir las ventanas que consideres oportunas. Las colocas en el
área de trabajo como mejor te parezca. Opino que, junto a la ventana de Edición que contiene el programa
fuente y la ventana Output con los mensajes de salida, abras también la ventana Watch donde puedes
visualizar/modificar los registros o variables empleadas. En este caso se trata de visualizar simplemente la
variable “Salida”. Sugiero visualizarla en binario. Para ello basta con seleccionarla con el botón derecho del
ratón, y luego ejecutar Properties  Format  Binary.

4-36
www.mkelectronica.com Microcontroladores PIC: Nivel I
No te olvides de salvar el proyecto mediante Project  Save Project y de cerrarlo correctamente
cuando acabes la sesión de trabajo mediante Project  Close.

P-4.4.3 Ejecución / depuración

Si ejecutas en tiempo real, mediante el comando Run, debes detener la ejecución mediante el
comando Halt. El bit 0 de la variable “Salida” puede estar a “0” o a “1”, dependiendo de en qué punto hayas
detenido la ejecución.

Ésta es una buena ocasión para ejecutar el programa en el modo Animate. Observarás cómo se
van ejecutando las instrucciones y cómo el bit 0 de la variable
“Salida” va cambiando de estado. Este modo de ejecución no sirve
para mucho más.

Si ejecutas paso a paso, mediante Step Into, podrás ver


exactamente la evolución del programa conforme se van ejecutando sus instrucciones. Presta especial
atención a la instrucción “btfsc” para ver cómo funciona tanto si se cumple la condición como si no.

El empleo de un punto de parada o breakpoint en la instrucción “Loop btfsc Salida,0” te permitirá


que, cada vez que acciones el botón Run, la ejecución se detenga una vez que se produzca el cambio de
estado correspondiente.

P-4.4.4 Ahora tú

Mide y anota el tiempo que tarda en ejecutarse un ciclo del programa. Es decir, el tiempo que
trascurre desde que el bit 0 de la variable “Salida” pasa de valer nivel “0” a valer nivel “1” o viceversa.

Ciclos de instrucción = _____________________ Tiempo = __________________________

4-37
www.mkelectronica.com Microcontroladores PIC: Nivel I
Ahora modifica el programa principal por este otro:

;Programa principal
Inicio clrf Salida ;Puesta a 0 inicial
movlw 0b00000001
Loop xorwf Salida,1 ;Función OR exclusiva
goto Loop ;Repite el chequeo

¿Funciona de la misma manera? __________________________________

¿Te atreves a dar una explicación? ________________________________________________________

____________________________________________________________________________________

____________________________________________________________________________________

Vuelve a medir y a anotar el tiempo que tarda en ejecutarse un ciclo del programa

Ciclos de instrucción = _____________________ Tiempo = __________________________

CONCLUSION: En este ejemplo se pretendía que emplearas las instrucciones de manipulación de bits. Sin
embargo debes tener siempre presente que un mismo programa se puede resolver de diferentes formas. La
mejor y más eficiente será aquella en la que emplees menos instrucciones y la misma tarea se realice en el
menor tiempo posible. Esta habilidad la irás adquiriendo con el tiempo y la experiencia.

P-4.5 Ejemplo 4-5: Rotación de bits

Con este último ejemplo terminamos la Unidad 4. Si


repasas todos los que has hecho hasta el momento,
observarás que has utilizado la mayor parte del juego de
instrucciones de la familia PIC16F. En esta ocasión vas a
emplear las dos instrucciones que permiten rotar a izquierda
y derecha el contenido de un registro o variable.

P-4.5.1 Descripción / edición del programa fuente

Con los conocimientos que ahora tienes, no creo que te sea muy difícil seguir el curso del siguiente
programa.

;Programa principal
Inicio movlw b'00000001'
movwf Salida ;Valor inicial a desplazar
bcf STATUS,C ;Inicialmente el carry vale "0"
Loop rlf Salida,F ;Rotación a la izquierda de la salida
btfss STATUS,C ;Se ha activado el carry ??
goto Loop ;No, seguir rotando a la izquierda
Loop_1 rrf Salida,F ;Si. Rotación a la derecha
btfss STATUS,C ;Se ha activado el carry ??
goto Loop_1 ;No, seguir rotando a la derecha
goto Loop ;Si. Repetir todo el ciclo

4-38
www.mkelectronica.com Microcontroladores PIC: Nivel I
Inicialmente el valor a desplazar en la variable “Salida” es b’00000001’ (0x01 en hex.) y el bit carry
(C) del registro STATUS se pone a “0”. La instrucción “rlf Salida,F” desplaza de forma circular ese valor una
posición hacia la izquierda. El bit de más peso, el 8º, se copia sobre el carry (C) y lo que éste tenía se copia
sobre el bit de menos peso, el bit 0. Esto se repite hasta que, tras ocho desplazamientos, el carry se pone
nuevamente a nivel “1”.

Ahora se repite el ciclo pero con la instrucción “rrf Salida, F”. Ésta desplaza de forma circular hacia
la derecha el valor actual de la variable “Salida”. El carry se copia sobre el bit de más peso, el 8º, y el bit de
menos peso, el bit 0, se copia sobre el carry. Esta situación se repite hasta que, tras otros ocho
desplazamientos, el carry se vuelve a poner a “1”. El ciclo completo se vuelve a repetir de forma indefinida.

P-4.5.2 Creación del proyecto y ensamblado

Mediante Project  Wizard crearás un proyecto llamado “Ejemplo 4-5.mcp”. Le asocias el


programa fuente “Ejemplo 4-5.asm”. Con el comando Project  Make (F10) lo ensamblamos para obtener
el correspondiente programa ejecutable “Ejemplo 4-5.hex” junto con otros ficheros auxiliares.

Usa Debugger  Select Tool para seleccionar el simulador MPLAB SIM y Configure 
Configuration Bits para desactivar el WDT. Ajusta la velocidad de simulación a 4MHz con el comando
Debugger  Settings y la ficha Osc/Trace.

Ahora es el momento también de abrir las ventanas que consideres oportunas. La figura te puede
servir de referencia. Te recomiendo que en la ventana Watch tengas a la vista el registro STATUS y la
variable “Salida”. Visualízalas en binario.

No te olvides de salvar el proyecto mediante Project  Save Project y de cerrarlo correctamente


cuando acabes la sesión de trabajo mediante Project  Close.

4-39
www.mkelectronica.com Microcontroladores PIC: Nivel I
P-4.5.3 Ejecución / depuración

Si ejecutas en tiempo real, con el comando Run, debes detener la ejecución mediante el comando
Halt. El valor de la variable “Salida” es impredecible y depende de en qué punto hayas detenido la
ejecución.

Tienes una buena ocasión para ejecutar el programa en el modo Animate. Observarás cómo se van
ejecutando las instrucciones y cómo los bits de “Salida” se van desplazando, primero de dcha. a izda. y
luego de izda. a dcha.

Si ejecutas paso a paso, mediante Step Into, podrás ver exactamente la evolución del programa
conforme se van ejecutando sus instrucciones. Presta especial atención a las instrucciones “rlf Salida,F”,
“rrf Salida ,F” y “btfss STATUS,C”. Observa los valores de la variable “Salida” y del bit C del registro
STATUS.

P-4.5.3 Ahora tú

En el ejemplo desplazabas de izda. a dcha., y de dcha. a izda. el nivel “1” de la variable “Salida”:
00000001  10000000  00000001. Imagina que se desea desplazar un nivel “0” sobre esa misma
variable: 11111110  01111111  11111110. Anota a continuación los cambios que debes hacer en el
programa fuente.

_____________________________________________________________________________________

_____________________________________________________________________________________

_____________________________________________________________________________________

_____________________________________________________________________________________

_____________________________________________________________________________________

_____________________________________________________________________________________

_____________________________________________________________________________________

En el material complementario dispones de los vídeos que explican el desarrollo de los 5 ejemplos
propuestos en esta Unidad 4. ¡¡ Échales un vistazo !!

¡Por fin has llegado al final de la Unidad 4! Ha sido una


Unidad larga y quizá muy densa. No quedaba más remedio
que mostrar todas las instrucciones de nuestro controlador
PIC16F886. A esas instrucciones había que
complementarlas con varios ejemplos con los que utilizar a
una buena parte de ellas. Aunque todos los ejemplos han
sido simulados, en todos ellos hemos empleado las mismas
técnicas que vas a usar en la realidad, a partir de la siguiente
unidad de este curso: edición del programa fuente, creación
del proyecto, ensamblado, depuración y puesta a punto.

Es un buen momento para que te relajes y te tomes un


respiro. Te hará falta…

4-40
www.mkelectronica.com Microcontroladores PIC: Nivel I
UNIDAD 5: LOS PUERTOS DE E/S

OBJETIVOS

Ya tienes los conocimientos básicos necesarios para realizar sencillos programas, crear proyectos,
ensamblarlos y depurarlos para su puesta a punto. Es el momento de que el controlador se pueda
comunicar con el mundo exterior para controlar diferentes periféricos.

En el área de teoría vamos a hablar de las puertas de E/S. Estas proporcionan una serie de patillas
a través de las cuales puedes conectar eléctricamente todo tipo de periféricos externos. No vas a estudiar
nuevas instrucciones ni nuevas técnicas de ensamblado, depuración, etc…, te basta con lo que ya sabes.
Lo que sí vas a estudiar es cómo se configuran esas puertas, cómo conectarles periféricos y cómo
controlarlos mediante tus programas.

En el área de prácticas vas a emplear el laboratorio USB-PIC’School. Dispone de un buen número


de periféricos con los que poder experimentar. De momento, en esta unidad, te deberás conformar con
utilizar sencillos pulsadores e interruptores como periféricos de entrada, y diodos leds como periféricos de
salida.

Hasta ahora has empleado el simulador MPLAB-SIM para depurar los diferentes programas. Se
trata de un simulador software, gratuito e incluido en el MPLAB, pero es eso, un simulador. Tu PC simulaba
el funcionamiento de un PIC ejecutando las instrucciones de un programa. Pero… si quieres controlar un led
o un pulsador ¿cómo lo conectas a ese PC? ¿Por dónde?

El simulador nos ha servido para estudiar cómo funcionan las instrucciones, cómo se ejecutan los
programas, técnicas de depuración, etc…, pero no da más de sí. Ahora hay que emplear una herramienta
hardware que permita hacer lo mismo pero de verdad, no mediante simulación. Esta herramienta es el
depurador PICkit-2 y es compatible con el laboratorio USB-PIC’School.

Los programas fuente se editan como ya sabes. De igual manera, los pasos para crear un proyecto,
ensamblarlo y configurar tu entorno de trabajo, también los conoces. Tampoco vas a aprender nuevas
técnicas de depuración. Seguirás usando las mismas técnicas para la ejecución paso a paso, ejecución en
tiempo real, con breakpoints, etc… También podrás visualizar y modificar registros y variables. La
diferencia fundamental es que todo lo que hagas ahora será real. Cuando visualizas o modificas un
registro o variable, esto tendrá lugar realmente en el interior del controlador. Si ejecutas un programa, éste
se ejecuta realmente en el interior del controlador. Si las instrucciones de ése programa actúan sobre las
puertas de E/S, estarás actuando realmente sobre los periféricos que en ellas estuvieran conectados.

Además realizarás un último proceso que hasta ahora no ha sido posible. Ahora grabarás
físicamente la memoria FLASH del controlador con el programa de aplicación debidamente depurado. El
controlador es ahora totalmente autónomo, y podrás insertarlo en la tarjeta electrónica de tu diseño. Es el
paso final en cualquier proyecto.

ÁREA DE TEORÍA

T-5.1 INTRODUCCIÓN
T-5.2 LA PUERTA A
T-5.2.1 Patillaje
T-5.2.2 Configuración adicional
T-5.2.3 Secuencia de inicialización

T-5.3 LA PUERTA B
T-5.3.1 Patillaje
T-5.3.2 Configuración adicional

5-1
www.mkelectronica.com Microcontroladores PIC: Nivel I
T-5.3.2.1 Entradas analógicas
T-5.3.2.2 Las resistencias de carga pull-up
T-5.3.2.3 Interrupciones por cambio de estado

T-5.4 LA PUERTA C
T-5.4.1 Patillaje
T-5.4.2 Secuencia de inicialización

T-5.5 LA PUERTA E
T-5.5.1 Patillaje

T-5.6 AHORA TÚ
T-5.6.1 Configurando la Puerta A
T-5.6.2 Configurando la Puerta B
T-5.6.3 Configurando la Puerta C

ÁREA DE PRÁCTICAS

P-5.1 INTRODUCCIÓN
P-5.2 EL LABORATORIO USB-PIC’School
P-5.2.1 Sección de Depuración / Grabación
P-5.2.2 Limitaciones durante la Depuración / Grabación

P-5.3 EJEMPLO 5-1: Control básico de las E/S


P-5.3.1 Descripción / Edición del programa fuente
P-5.3.2 Proyecto y ensamblado
P-5.3.3 Montaje eléctrico
P-5.3.4 Ejecución / Depuración
P-5.3.5 Grabación del dispositivo
P-5.3.6 Comprobaciones finales
P-5.3.7 Ahora tú

P-5.4 EJEMPLO 5-2: Salida invertida


P-5.4.1 Descripción / Edición del programa fuente
P-5.4.2 Proyecto y ensamblado
P-5.4.3 Montaje eléctrico
P-5.4.4 Ejecución / Depuración
P-5.4.5 Grabación del dispositivo
P-5.4.6 Comprobaciones finales
P-5.4.7 Ahora tú

P-5.5 EJEMPLO 5-3: Decodificador digital


P-5.5.1 Descripción / Edición del programa fuente
P-5.5.2 Proyecto y ensamblado
P-5.5.3 Montaje eléctrico
P-5.5.4 Ejecución / Depuración
P-5.5.5 Grabación del dispositivo
P-5.5.6 Comprobaciones finales
P-5.5.7 Ahora tú

P-5.6 EJEMPLO 5-4: Automatismo


P-5.6.1 Descripción / Edición del programa fuente
P-5.6.2 Proyecto y ensamblado
P-5.6.3 Montaje eléctrico
P-5.6.4 Ejecución / Depuración

5-2
www.mkelectronica.com Microcontroladores PIC: Nivel I
P-5.6.5 Grabación del dispositivo
P-5.6.6 Comprobaciones finales
P-5.6.7 Ahora tú

P-5.7 EJEMPLO 5-5: Juego de luces


P-5.7.1 Descripción / Edición del programa fuente
P-5.7.2 Proyecto y ensamblado
P-5.7.3 Montaje eléctrico
P-5.7.4 Ejecución / Depuración
P-5.7.5 Grabación del dispositivo
P-5.7.6 Comprobaciones finales
P-5.7.7 Ahora tú

P-5.8 ¿ALGO MÁS?


P-5.8.1 Esquema eléctrico
P-5.8.2 Montaje práctico

MATERIAL COMPLEMENTARIO

 Guía rápida de referencia


o Las Puertas de entrada/salida

 Ejemplos Unidad 5
 Vídeos
o Presentación de USB-PIC’School
o El Ejemplo 5-1
o El resto de los ejemplos
 Soluciones de la Unidad 4
 Cuestionario

5-3
www.mkelectronica.com Microcontroladores PIC: Nivel I
5-4
www.mkelectronica.com Microcontroladores PIC: Nivel I
AREA DE TEORÍA

T- 5.1 INTRODUCCIÓN

El sistema para el interface de periféricos más sencillo, clásico e imprescindible son las llamadas
líneas de entrada o salida (E/S). Se vienen utilizando desde siempre y no se concibe un microcontrolador,
desde el más sencillo y económico hasta el más complejo, que no las tenga en menor o mayor cantidad.

En un principio, las líneas de E/S están formadas por circuitos digitales que permiten transferir
información (digital) entre el controlador y los periféricos. Se agrupan en torno a lo que se llaman Puertas.
Cada puerta puede agrupar un determinado número de líneas o patillas. Suele ser muy frecuente emplear
puertas con 8 líneas de E/S. Además, hoy en día, cada una de esas líneas pueden tener distintas utilidades
en función de cómo se les configure.

Tal y como se muestra en la figura, asociado a


cada Puerta de E/S hay al menos un registro de
configuración con el que se establece qué líneas de
esa Puerta van a actuar como entradas y qué líneas lo
harán como salidas.

Resumiendo, una puerta consta de una serie


de líneas que se corresponden con patillas físicas del
controlador. A través de ellas se conectan los distintos
periféricos a gobernar: relés, sensores, pulsadores,
leds, etc... Cada puerta tiene asociado un registro de
configuración. Según el valor binario que en él se
introduzca, la línea o patilla asociada se configura como entrada o como salida. Tomando la figura como
ejemplo, un bit “1” hace que su correspondiente patilla actúe como entrada y un bit “0” como salida.

Una vez configurada una puerta, nuestro programa podrá controlar los periféricos conectados en
sus patillas. Se emplean instrucciones que permiten la lectura y/o escritura de la misma. Puedes leer y/o
escribir sobre las ocho líneas o patillas de una puerta, a nivel de byte, empleando instrucciones típicas que
ya conoces. Por ejemplo, para leer el estado binario de los periféricos de entrada conectadas con las patillas
de la Puerta A, emplearías algo así como: “movf PORTA,W”. Si lo que quieres es aplicar unas señales
binarias a los periféricos de salida conectados con las patillas de la Puerta B, emplearías algo parecido a
esto: “movwf PORTB”. También se pueden controlar de forma individual, a nivel de bits, cada una de esas
líneas. Con la instrucción “btfss PORTA, 6” puedes chequear el estado del interruptor conectado en la
patilla 6 de la puerta A, y con la instrucción “bsf PORTB, 2” activar el relé conectado en la patilla 2 de la
puerta B. ¿Te acuerdas de esas instrucciones? Se estudiaron en la Unidad 4 anterior. ¡¡ No hay
instrucciones específicas para el control de periféricos !!

Vamos a dedicar esta Unidad al estudio de las puertas de E/S de nuestro PIC16F886, donde debes
recordar que, tanto las propias puertas, como sus correspondientes registros de configuración, forman parte
de lo que hemos venido denominando como registros especiales o SFR, y que se encuentran en sus
correspondientes direcciones del área RAM de datos.

T-5.2 LA PUERTA A

Conocida como PORTA se trata de una puerta bidireccional de 8 bits, que permite el acceso a otras
tantas patillas del controlador PIC16F866. Su registro de configuración recibe el nombre de TRISA y, según
el valor binario que en él se introduzca, así se comportarán las patillas de la puerta: un bit “1” como entrada
(por defecto) y un bit “0” como salida. A continuación se muestra una descripción del registro
correspondiente a la Puerta A dentro del área RAM de datos....

5-5
www.mkelectronica.com Microcontroladores PIC: Nivel I
Nombre: PORTA (Puerta A) Dirección: 0x05 Banco: 0
R/W-x R/W-x R/W-x R/W-x R/W-x R/W-x R/W-x R/W-x
RA7 RA6 RA5 RA4 RA3 RA2 RA1 RA0

RA<7:0> Nivel lógico en cada patilla de E/S


1 = Patilla a nivel “1”
0 = Patilla a nivel “0”

.... y ahora una descripción de su correspondiente registro de configuración.

Nombre: TRISA (Configuración de A) Dirección: 0x85 Banco: 1


R/W-1 R/W-1 R/W-1 R/W-1 R/W-1 R/W-1 R/W-1 R/W-1
(1) (2) (1) (2) (2) (2) (2) (2) (2) (2)
TRISA7 TRISA6 TRISA5 TRISA4 TRISA3 TRISA2 TRISA1 TRISA0

TRISA<7:0> Configuración individual para cada línea o patilla


1 = La patilla se configura como entrada en alta impedancia
0 = La patilla se configura como salida

NOTAS:

(1) Si se selecciona el oscilador tipo XT, HS o LP, los bits 6 y 7 de TRISA se leen siempre como nivel
“1”.
(2) Al conectar la alimentación o reiniciar el sistema, el registro TRISA se carga con todos los bits a “1”.
De esta forma todas las líneas de la puerta A, queden configuradas como entradas en alta
impedancia. Con esto se evita que ningún periférico de salida (p.e. un relé) se active de forma
descontrolada nada más alimentar el sistema.

T-5.2.1 Patillaje

Una de las características de los actuales controladores PIC, es que algunas de sus patillas pueden
tener asignadas otras funciones además de las clásicas E/S digitales. La puerta A de nuestro PIC16F886 no
podía ser menos. De momento la vas a usar como una puerta de E/S digital, aunque quizá en un futuro las
emplees como entradas analógicas, entradas a los comparadores, de tensión de referencia, etc… En la
figura tienes la situación física de las 8 patillas de la Puerta A (RA0-RA7).

5-6
www.mkelectronica.com Microcontroladores PIC: Nivel I
En la tabla tienes un resumen de todas las patillas que forman la puerta A, sus funciones,
descripción de las mismas y patillaje. Recuerda que de momento las vas a usar como simples patillas de
entrada o salida de propósito general.

PIN NOMBRE FUNCION DESCRIPCIÓN


2 RA0 E/S digital de propósito general
RA0/AN0/ULPWU/C12IN0- AN0 Entrada 0 del convertidor analógico digital
ULPWU Entrada de interrupción por cambio de estado y muy bajo consumo
C12IN0- Entrada invertida 0 para los comparadores analógicos C1 o C2
3 RA1 E/S digital de propósito general
RA1/AN1/C12IN1- AN1 Entrada 1 del convertidor analógico digital
C12IN1- Entrada invertida 1 para los comparadores analógicos C1 y C2
4 RA2 E/S digital de propósito general
RA2/AN2/VREF-/CVREF AN2 Entrada 2 del convertidor analógico digital
/C2IN+ VREF- Entrada de tensión de referencia negativa para el convertidor A/D
CVREF Salida de tensión de referencia del comparador
C2IN+ Entrada no invertida del comparador C2
5 RA3 E/S digital de propósito general
RA3/AN3/VREF+/C1IN+ AN3 Entrada 3 del convertidor analógico digital
VREF+ Entrada de tensión de referencia positiva para el convertidor A/D
C1IN+ Entrada no invertida del comparador C1
6 RA4 E/S digital de propósito general
RA4/T0CKI/C1OUT T0CKI Entrada de reloj externo para el temporizador Timer 0
C1OUT Salida del comparador C1
7 RA5 E/S digital de propósito general
RA5/AN4/SS/C2OUT AN4 Entrada 4 del convertidor analógico digital
SS Entrada de selección de dispositivo SPI en modo esclavo
C2OUT Salida del comparador C2
10 RA6 E/S digital de propósito general
RA6/OSC2/CLKOUT OSC2 Salida de conexión para el cristal de cuarzo o resonador externo
CLKOUT Salida de la señal de reloj del sistema (FOSC/4)
9 RA7 E/S digital de propósito general
RA7/OSC1/CLKIN OSC1 Entrada de conexión para el cristal de cuarzo o resonador externo
CLKIN Entrada reloj externo para el sistema u oscilador RC

T-5.2.2 Configuración adicional

Como puedes ver, todas las líneas de la Puerta A pueden actuar como E/S digitales, pero algunas
de ellas también pueden actuar como entradas analógicas. La selección entre un tipo u otro de entradas se
realiza mediante el registro ANSEL que tienes a continuación:

Nombre: ANSEL (Selección Dirección: Banco: 3


analógica) 0x188
R/W-1 R/W-1 R/W-1 R/W-1 R/W-1 R/W-1 R/W-1 R/W-1
(1) (2) (1) (2) (1) (2) (1) (1) (1) (1) (1)
ANS7 ANS6 ANS5 ANS4 ANS3 ANS2 ANS1 ANS0

ANS<7:0> Bits de selección de entradas analógicas


1 = Patilla de entrada analógica
0 = Patilla de E/S digital

NOTAS:

(1) Cuando una patilla se configura como entrada analógica automáticamente se desconectan todas las
funcionalidades del circuito de entrada digital asociadas a esa patilla. El correspondiente bit en el
registro TRISA se debe configurar también como entrada.
(2) Estas patillas no están implementadas en los dispositivos PIC16F883/886, únicamente lo están en
los dispositivos PIC16F884/887 de 40 patillas.

5-7
www.mkelectronica.com Microcontroladores PIC: Nivel I
T-5.2.3 Secuencia de inicialización

A modo de ejemplo se muestra una posible secuencia de instrucciones para la inicialización de la


Puerta A. Las líneas o patillas <RA3:2>, se configuran como entradas y el resto como salidas.

CLRF PORTA ;Borra los latch de salida


BSF STATUS,RP0
BSF STATUS,RP1 ;Selecciona el banco 3
CLRF ANSEL ;La puerta A se configura como digital
BCF STATUS,RP1 ;Selecciona el banco 1
MOVLW b’00001100’
MOVWF TRISA ;RA<3:2> entradas, resto salidas
BCF STATUS,RP0 ;Selecciona el banco 0

Una primera e importante tarea consiste en poner aquellas líneas que vayan a ser salidas, a un nivel
lógico conocido, por ejemplo a “0”, mediante “CLRF PORTA”. Se evita así que por ellas aparezca un nivel
lógico aleatorio que provoque un funcionamiento incorrecto de los periféricos que tuvieran conectados.

Mediante “BSF STARUS,RP0” y “BSF STATUS, RP1” se selecciona el banco 3 del área de datos
RAM donde se encuentra el registro ANSEL (ver el listado de registros). Con “CRLF ANSEL” se pone a
0x00 y todas las patilla de la Puerta A se configuran por tanto como digitales.

Con “BCF STATUS,RP1” se selecciona ahora el banco 1 donde se encuentra el registro TRISA (ver
el listado de registros). Éste se carga con el valor binario b’00001100’ que configura a RA<3:2> como
entradas (por defecto) y al resto como salidas. Estas salidas se ponen inmediatamente a “0” gracias a la
primera instrucción de la secuencia (“CLRF PORTA”).

Finalmente, con la instrucción “BCF STATUS,RP0”, se vuelve a seleccionar el banco 0. A partir de


ahora, todas las instrucciones, sean a nivel de byte o a nivel de bit, que afectan al registro PORTA, tendrán
efecto inmediato sobre las patillas físicas y por tanto sobre los periféricos que en ellas estuvieran
conectados.

T-5.3 LA PUERTA B

Se le conoce como PORTB y se trata de una puerta bidireccional de 8 bits, que permite el acceso a
otras tantas patillas del controlador PIC16F866. Su registro de configuración recibe el nombre de TRISB y,
según el valor binario que en él se introduzca, se comportarán las patillas de la puerta: un bit “1” como
entrada (por defecto) y un bit “0” como salida. A continuación se muestra una descripción del registro
correspondiente a la Puerta B dentro del área RAM de datos....

Nombre: PORTB (Puerta B) Dirección: x06 Banco: 0


R/W-x R/W-x R/W-x R/W-x R/W-x R/W-x R/W-x R/W-x
RB7 RB6 RB5 RB4 RB3 RB2 RB1 RB0

RB<7:0> Nivel lógico en cada patilla de E/S


1 = Patilla a nivel “1”
0 = Patilla a nivel “0”

.... y ahora una descripción de su correspondiente registro de configuración.

Nombre: TRISB (Configuración de B) Dirección: 0x86 Banco: 1


R/W-1 R/W-1 R/W-1 R/W-1 R/W-1 R/W-1 R/W-1 R/W-1
TRISB7 TRISB6 TRISB5 TRISB4 TRISB3 TRISB2 TRISB1 TRISB0

5-8
www.mkelectronica.com Microcontroladores PIC: Nivel I
TRISB<7:0> Configuración individual para cada línea o patilla
1 = La patilla se configura como entrada en alta impedancia
0 = La patilla se configura como salida

T-5.3.1 Patillaje

Una de las características de los actuales controladores PIC, es que algunas de las líneas pueden
tener asignadas otras funciones además de las clásicas E/S digitales. La puerta B de nuestro PIC16F886
también. De momento la vas a usar como una puerta de E/S digital, aunque quizá en un futuro las emplees
como entradas analógicas o salidas de señal PWM. En la figura tienes la situación física de las 8 patillas de
la Puerta B (RB0-RB7).

En la tabla tienes un resumen de todas las patillas que forman la puerta B, sus funciones,
descripción de las mismas y patillaje. Recuerda que de momento las vas a usar como simples patillas de
entrada o salida de propósito general.

PIN NOMBRE FUNCION DESCRIPCIÓN


21 RB0/AN12/INT RB0 E/S digital de propósito general
AN12 Entrada 12 del convertidor analógico digital
INT Entrada de interrupción externa
22 RB1/AN10/P1C RB1 E/S digital de propósito general
AN10 Entrada 10 del convertidor analógico digital
P1C Salida C de señal PWM
23 RB2/AN8/P1B RB2 E/S digital de propósito general
AN8 Entrada 8 del convertidor analógico digital
P1B Salida B de señal PWM
24 RB3/AN9/PGM/C12IN2- RB3 E/S digital de propósito general
AN9 Entrada 9 del convertidor analógico digital
PGM Habilitación para la grabación ICSP con baja tensión
C12IN2- Entrada invertida 2 para los comparadores analógicos C1 y C2
25 RB4/AN11/P1D RB4 E/S digital de propósito general
AN11 Entrada 11 del convertidor analógico digital
P1D Salida D de señal PWM
26 RB5/AN13/T1G RB5 E/S digital de propósito general
AN13 Entrada 13 del convertidor analógico digital
T1G Entrada de disparo para el temporizador Timer 1
27 RB6/ICSPCLK RB6 E/S digital de propósito general
ICSPCLK Entrada de reloj durante la grabación ICSP
28 RB7/ICSPDAT RB7 E/S digital de propósito general
ICSPDAT Entrada/salida de datos durante la grabación ICSP

5-9
www.mkelectronica.com Microcontroladores PIC: Nivel I
T-5.3.2 Configuración adicional

Las líneas de la Puerta B tienen asignadas diferentes funciones y prestaciones. Pueden actuar
como entradas analógicas, se les puede asignar resistencias de carga “pull-up” y también tienen capacidad
de provocar una interrupción cuando, en cualquiera de las que estén configuradas como entradas, se
detecte un cambio de estado o nivel lógico.

T-5.3.2.1 Entradas analógicas

Mediante el registro ANSELH se puede seleccionar qué líneas de la Puerta B serán entradas
analógicas o entradas/salidas digitales.

Nombre: ANSELH (Selec. Dirección: 0x189 Banco: 3


analógica)
U-0 U-0 R/W-1 R/W-1 R/W-1 R/W-1 R/W-1 R/W-1
(1) (1) (1) (1) (1) (1)
---- ---- ANS13 ANS12 ANS11 ANS10 ANS9 ANS8

ANSH<7:6> No se emplean. Se leen como nivel “0”


ANSH<5:0> Bits de selección de entradas analógicas
1 = Patilla de entrada analógica
0 = Patilla de E/S digital o función especial

NOTAS:

(1) Cuando una patilla se configura como entrada analógica, automáticamente se desconectan todas
las funcionalidades del circuito de entrada digital asociadas a esa patilla (cargas pull-up e
interrupción por cambio de estado). El correspondiente bit en el registro TRISB se debe configurar
también como entrada.

T-5.3.2.2 Las resistencias de carga pull-up

A cada patilla de la Puerta B le puedes asignar de forma individual, una resistencia interna de carga
conectada al positivo (pull-up). Para ello debes emplear el registro WPUB que se muestra a continuación.
Esto sólo es aplicable en aquellas líneas que hayas configurado como entradas digitales. Cuando una línea
se configura como salida, automáticamente se desconecta la carga pull-up. Todas estas cargas quedan
desconectadas en la secuencia de encendido o “Power on Reset” (POR), que pone a nivel “1” el bit /RBPU
del registro OPTION (consulta la Unidad 2).

Nombre: WPUB (Selec. Pull-up) Dirección: 0x95 Banco: 1


R/W-1 R/W-1 R/W-1 R/W-1 R/W-1 R/W-1 R/W-1 R/W-1
WPUB7 WPUB6 WPUB5 WPUB4 WPUB3 WPUB2 WPUB1 WPUB0

WPUB<7:0> Bits de activación de las resistencias de carga pull-up


1 = Resistencia de carga activada
0 = Resistencia de carga desactivada

T-5.3.2.3 Interrupción por cambio de estado

Cada una de las patillas de la Puerta B se puede configurar también como entradas de interrupción.
Esta ocurrirá cada vez que se produzca un cambio de estado en una de ellas. Los bits del registro IOCB te
permiten activar o no esta posibilidad. Por defecto, tras la secuencia de encendido (POR), quedan
desconectadas.

En aquellas líneas de entrada que tengan activada esta funcionalidad, el valor lógico actual de sus
patillas se compara con el valor que tenían durante la última lectura de las mismas. Si se detecta una

5-10
www.mkelectronica.com Microcontroladores PIC: Nivel I
diferencia se produce la interrupción. Ésta puede anularse leyendo simplemente la Puerta B con el nuevo
valor actual de sus entradas.

Nombre: IOCB (Int. Por cambio) Dirección: 0x96 Banco: 1


R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0
IOCB7 IOCB6 IOCB5 IOCB4 IOCB3 IOCB2 IOCB1 IOCB0

IOCB<7:0> Bits de activación de las interrupciones por cambio de estado


1 = Interrupción por cambio de estado activada
0 = Interrupción por cambio de estado desactivada

T-5.4 LA PUERTA C

Llamada PORTC se trata de una puerta bidireccional de 8 bits, que permite el acceso a otras tantas
patillas del controlador PIC16F866. También se le conoce como “puerta de comunicaciones”. Su registro de
configuración recibe el nombre de TRISC y, según el valor binario que en él se introduzca, se comportarán
las patillas de la puerta: un bit “1” como entrada (por defecto) y un bit “0” como salida. A continuación se
muestra una descripción del registro correspondiente a la Puerta C dentro del área RAM de datos....

Nombre: PORTC (Puerta C) Dirección: 0x07 Banco: 0


R/W-x R/W-x R/W-x R/W-x R/W-x R/W-x R/W-x R/W-x
RC7 RC6 RC5 RC4 RC3 RC2 RC1 RC0

RC<7:0> Nivel lógico en cada patilla de E/S


1 = Patilla a nivel “1”
0 = Patilla a nivel “0”

.... y ahora una descripción de su correspondiente registro de configuración.

Nombre: TRISC (Configuración de C) Dirección: 0x87 Banco: 1


R/W-1 R/W-1 R/W-1 R/W-1 R/W-1 R/W-1 R/W-1 R/W-1
TRISC7 TRISC6 TRISC5 TRISC4 TRISC3 TRISC2 TRISC1 (1) TRISC0 (1)

TRISC<7:0> Configuración individual para cada línea o patilla


1 = La patilla se configura como entrada en alta impedancia
0 = La patilla se configura como salida

NOTAS:

(1) Estos bits se leen siempre a “0” al seleccionar un oscilador del tipo LP para el Timer 1

T-5.4.1 Patillaje

Una de las características de los actuales controladores PIC, es que algunas de las líneas pueden
tener asignadas otras funciones además de las clásicas E/S digitales. La puerta C de nuestro PIC16F886
también. De momento la vas a usar como una puerta de E/S digital, aunque quizá en un futuro las emplees
como entradas o salidas de los módulos CCP, comunicaciones serie, I2C, SPI, etc… En la figura tienes la
situación física de las 8 patillas de la Puerta C (RC0-RC7).

5-11
www.mkelectronica.com Microcontroladores PIC: Nivel I
La tabla resume todas las patillas que forman la puerta C, sus funciones, descripción de las mismas
y patillaje. Recuerda que de momento las vas a usar como simples patillas de entrada o salida de propósito
general.

PIN NOMBRE FUNCION DESCRIPCIÓN


11 RC0/T1OSO/T1CKI RC0 E/S digital de propósito general
T1OSO Salida del oscilador para el temporizador Timer 1
T1CKI Entrada de reloj externo para el temporizador Timer 1
12 RC1/T1OSI/CCP2 RC1 E/S digital de propósito general
T1OSI Salida del oscilador externo para el temporizador Timer 1
CCP2 Entrada o salida desde el módulo CCP2
13 RC2/P1A/CCP1 RC2 E/S digital de propósito general
P1A Salida A de señal PWM
CCP1 Entrada o salida desde el módulo CCP1
14 RC3/SCK/SCL RC3 E/S digital de propósito general
SCK Señal de reloj para el bus SPI
SCL Señal de reloj para el bus I2C
15 RC4/SDI/SDA RC4 E/S digital de propósito general
SDI Entrada de datos serie para el bus SPI
SDA Entrada o salida de datos serie para el bus I2C
16 RC5/SDO RC5 E/S digital de propósito general
SDO Salida de datos serie para el bus SPI
17 RC6/TX/CK RC6 E/S digital de propósito general
TX Transmisión de datos desde el USART en modo asíncrono
CK Señal de reloj para el USART en comunicaciones síncronas
18 RC7/RX/DT RC7 E/S digital de propósito general
RX Recepción de datos en el USART en modo asíncrono
DT Línea de datos del USAR en comunicaciones síncronas

T-5.4.2 Secuencia de inicialización

A modo de ejemplo aquí tienes una posible secuencia de instrucciones para la inicialización de la
Puerta C en la que las líneas o patillas <RC3:2> se configuran como entradas y el resto como salidas.

CLRF PORTC ;Borra los latch de salida


BSF STATUS,RP0 ;Selecciona el banco 1
MOVLW b’00001100’
MOVWF TRISC ;RC<3:2> entradas, resto salidas
BCF STATUS,RP0 ;Selecciona el banco 0

5-12
www.mkelectronica.com Microcontroladores PIC: Nivel I
Una primera e importante tarea consiste en poner aquellas líneas que vayan a ser salidas, a un nivel
lógico conocido, por ejemplo a “0” mediante “CLRF PORTC”. Se evita así que por ellas aparezca un nivel
lógico aleatorio que provoque un incorrecto funcionamiento de los periféricos que tuvieran conectados.

Con “BSF STATUS,RP0” se selecciona ahora el banco 1 donde se encuentra el registro TRISC (ver
el listado de registros). Éste se carga con el valor binario b’00001100’ que configura a RC<3:2> como
entradas (por defecto) y al resto como salidas. Estas salidas se ponen inmediatamente a “0” gracias a la
primera instrucción de la secuencia.

Finalmente, con la instrucción “BCF STATUS,RP0”, se vuelve a seleccionar el banco 0. A partir de


ahora todas las instrucciones, sean a nivel de byte o de bit, que afectan al registro PORTC, tendrán efecto
inmediato sobre los periféricos que en ella estuvieran conectados.

T-5.5 LA PUERTA E

Conocida como PORTE, se trata de una puerta que, en el caso particular del dispositivo PIC16F886,
consta de una única patilla que sólo puede actuar como entrada. En el caso de los dispositivos de 40
patillas como el PIC16F884 o PIC16F887 esta puerta consta de 4 patillas. La siguiente tabla muestra una
descripción del registro correspondiente a la Puerta E dentro del área RAM de datos....

Nombre: PORTE (Puerta E) Dirección: 0x09 Banco: 0


U-0 U-0 U-0 U-0 R-x R/W-x R/W-x R/W-x
---- ---- ---- ---- RE3 RE2 RE1 RE0

RE<7:4> No implementados, se leen siempre a “0”


RE<3:0> Nivel lógico en cada patilla de E/S
1 = Patilla a nivel “1”
0 = Patilla a nivel “0”

.... y ahora una descripción de su correspondiente registro de configuración.

Nombre: TRISE Dirección: 0x89 Banco: 1


(Configuración de PORTE)
U-0 U-0 U-0 U-0 R-1 (1) R/W-1 R/W-1 R/W-1
---- ---- ---- ---- TRISE3 TRISE2 TRISE1 TRISE0

TRISE<7:4> No implementados, se leen siempre a “0”


TRISE<3:0> Configuración individual para cada línea o patilla
1 = La patilla se configura como entrada en alta impedancia
0 = La patilla se configura como salida

NOTAS:

(1) TRISE<3> sólo se puede leer (un “1”) ya que la patilla RE3 únicamente actúa como entrada

T-5.5.1 Patillaje de la Puerta E

La puerta E de nuestro PIC16F886 sólo dispone de la patilla RE3, que únicamente puede actuar
como entrada (mira la figura). En los dispositivos PIC16F884 y PIC16F887 la Puerta E consta de 4 patillas.

PIN NOMBRE FUNCION DESCRIPCIÓN


1 RE3/MCLR/Vpp RE3 Entrada digital de propósito general
MCLR Entrada de RESET con resistencia pull-up interna
Vpp Entrada de tensión durante los ciclos de grabación

5-13
www.mkelectronica.com Microcontroladores PIC: Nivel I
Dentro del material complementario te puedes descargar la guía rápida donde se resumen todos los
registros especiales SFR destinados a configurar las diferentes puertas de entradas / salidas.
Imprímela y colecciónala junto con el resto de guías.

T- 5.6 AHORA TÚ

Supón que, como se muestra en la figura, en las patillas de las diferentes puertas tienes conectados
una serie de periféricos. Fíjate en el sentido de las flechas porque determinan si el periférico asociado a
cada patilla es de entrada o de salida. Completa las tablas de los siguientes apartados con las instrucciones
necesarias para configurar cada puerta en función de las especificaciones.

T-5.6.1 Configurando la Puerta A

La patilla RA0 y RA3 actúan como entradas analógicas (AN0 y AN3). El resto de patillas son
entradas o salidas digitales. Se supone un oscilador interno de trabajo por lo que no está seleccionado el
modo de oscilador XT, HS ni LP.

INSTRUCCIÓN DESCRIPCIÓN

5-14
www.mkelectronica.com Microcontroladores PIC: Nivel I
T-5.6.2 Configurando la Puerta B

Las patillas de la Puerta B actúan todas ellas como entradas o salidas digitales. A las patillas
RB3:RB0 se les asocia las resistencias pull-up internas y tienen capacidad de interrupción cada vez que
cambien de estado.

INSTRUCCIÓN DESCRIPCIÓN

T-5.6.3 Configurando la Puerta C

Las patillas de la Puerta C se configuran como entradas o salidas digitales según la figura anterior.

INSTRUCCIÓN DESCRIPCIÓN

5-15
www.mkelectronica.com Microcontroladores PIC: Nivel I
5-16
www.mkelectronica.com Microcontroladores PIC: Nivel I
AREA DE PRACTICAS

P-5.1 INTRODUCCIÓN

En éste área de prácticas vas a trabajar con las puertas de E/S mediante una serie de ejemplos en
los que vas a conectar distintos periféricos. Además, los proyectos los vas a llevar hasta el final. No vas a
conformarte con simular simplemente su funcionamiento como hiciste con los ejemplos de las unidades
anteriores. A partir de ahora los ejemplos se depurarán y ejecutarán en tiempo real y los terminarás
grabando en la memoria Flash de programa del propio controlador.

Varios son los objetivos a cubrir:

 Utilizar periféricos reales de carácter digital que se conectan a las distintas patillas de las
diferentes puertas de E/S que dispone el PIC16F886.
 Esos periféricos se encuentran en el laboratorio USB-PIC’School. Es decir, necesitas de
una plataforma que te facilite al máximo el montaje hardware de los circuitos a probar, de
forma que te centres fundamentalmente en el software que los controla. Aunque hemos
elegido USB-PIC’School como laboratorio de prácticas, eres muy libre de utilizar
cualquier otro sistema. Los ejemplos deberían funcionar siempre y cuando se respeten
las mismas conexiones eléctricas.
 Empleo de herramientas hardware para la depuración de un programa. Ya no vas a
utilizar el simulador MPSIM que se incluye con el MPLAB-IDE, y que tan buenos
resultados nos ha dado hasta el momento. Ahora vas a utilizar el depurador en circuito
que integra el laboratorio USB-PIC’School, y que es compatible con el depurador PICkit-
2 de Microchip. No te preocupes, prácticamente todo lo que aprendiste con el simulador
lo usarás también con el depurador.
 Con el sistema de depuración veremos en tiempo real, cómo reacciona nuestro
programa a las señales que generan los periféricos de entrada, y cómo se actúa sobre
los de salida.
 Una vez depurado un programa procederás a su grabación. A partir de este momento, el
controlador es totalmente autónomo respecto al PC e incluso respecto al laboratorio. En
un proyecto o aplicación real, es en este punto cuando diseñarás una tarjeta electrónica
a medida, en la que incluirás el controlador recién grabado y los periféricos empleados
en el proyecto. Existen en el mercado tarjetas muy económicas para llevar a cabo este
último paso. Un ejemplo puede ser la tarjeta PIC’Control también diseñada y
comercializada por MK Electrónica.

P-5.2 EL LABORATORIO USB-PIC’School

Te en cuenta que para poder


realizar los distintos ejemplos y
experiencias que se van a proponer,
tenemos que utilizar algún tipo de
plataforma experimental. Hemos
elegido este laboratorio, mostrado en
la figura, porque cumple los
siguientes requisitos, que considero
importantes en una herramienta
didáctica:

 Mediante un interface USB


se conecta con el PC y es
compatible con el entorno de
trabajo MPLAB-IDE original
de Microchip. Así pues, todo
lo que has aprendido hasta
el momento, lo seguirás
utilizando.

5-17
www.mkelectronica.com Microcontroladores PIC: Nivel I
 Admite diferentes tipos de dispositivos PIC de 12, 18, 28 y 40 patillas de las familias
PIC12, PIC16 y PIC18. De serie incorpora el PIC16F886.
 Integra un sistema de depuración en tiempo real y de grabación. Podemos depurar
nuestro programa y grabarlo sin tener que sacar el microcontrolador de su zócalo.
 Contiene los periféricos más relevantes empleados en cualquier proyecto y que además
te permitirán explotar todos los recursos internos del microcontrolador.
 La conexión entre los periféricos y el controlador es muy sencilla y sin necesidad de
hacer soldadura alguna. Basta con emplear sencillos cables rígidos de 0,6 mm de
grosor.
 Dispone de un módulo board para el montaje sin soldadura de cualquier circuito
electrónico, interfaces, ampliaciones, sensores, etc. También dispone de un conector de
expansión que permite conectar el laboratorio con cualquier otra tarjeta externa.
 Se suministra en un maletín que resulta muy cómodo para guardar tus montajes de un
día para otro o bien para su transporte en labores de campo.

P-5.2.1 Sección de Depuración / Grabación

Una de las grandes aportaciones del laboratorio USB-PIC’School, es que incorpora un hardware y
un firmware que permite la depuración/grabación en circuito, de la aplicación que estés desarrollando.

Dispones así de una potente herramienta gracias a la cual puedes, en fase de diseño, realizar la
depuración en tiempo real y la puesta a punto de tus proyectos. Una vez depurados y funcionando, puedes
también proceder a grabarlos sobre la memoria interna del controlador. Se trata pues de una herramienta
muy apreciada en centros de enseñanza, laboratorios, centros de I+D, ingenierías y, en general,
diseñadores de aplicaciones basadas en controladores PIC.

Las capacidades de depuración del USB-PIC’School permiten la ejecución de un programa en


tiempo real, con puntos de parada (Breakpoints) y paso a paso. Es posible visualizar los registros internos y
hacer un seguimiento analizando el contenido de los mismos conforme se van ejecutando las instrucciones
del programa. También es posible modificar ese contenido para estudiar y observar la repercusión que esto
puede provocar en el curso de la ejecución. Todo ello en tiempo real y sin extraer el PIC del laboratorio.
Emplea la técnica conocida como ICD=In Circuit Debugger (Depuración en Circuito).

Las limitaciones de depuración/grabación del USB-PIC’SCHOOL son las mismas que las del PICkit-
2 de Microchip, y están sujetas a las limitaciones inherentes al propio controlador que estés empleando.
Algunos controladores, los más antiguos, no admiten depuración en circuito (ICD). Algunos admiten un
único punto de parada o Breakpoint y otros admiten varios. Para este tipo de detalles es necesario que
consultes la información técnica específica de cada controlador, suministrada por el fabricante en sus
correspondientes data sheet y/o en el entorno de desarrollo MPLAB-IDE.

La figura muestra la sección de


Depuración/Grabación que integra el
laboratorio USB-PIC’School y en donde se
destacan los elementos más importantes:

1. Conector USB hembra tipo B para la


conexión con el puerto USB del PC. Se
emplea el cable adaptador macho tipo
A, a macho tipo B que se incluye en el
equipo.
2. Este led se activa siempre que USB-
PIC’SCHOOL esté realizando algún
ciclo activo transfiriendo información
hacia/desde el PC a través del puerto
USB.
3. Conector RJ11 para la conexión con
otras herramientas hardware externas,
para la Depuración/Grabación (ICD3,

5-18
www.mkelectronica.com Microcontroladores PIC: Nivel I
PICKit-3, REAL-ICE, etc.). Transporta las señales de Depuración/Grabación PGC, PGD,
GND, Vcc y MCLR/Vpp, conocidas como “señales ICSP” o In Circuit Serial Programming
(Programación Serie en Circuito). Están distribuidas como se muestra en la figura y su
correspondiente tabla adjunta.

NºPIN SEÑAL DESCRIPCIÓN


1 MCLR/Vpp Señal Vpp de grabación
2 VDD Alimentación +VDD
3 GND Tierra de alimentación
4 PGD Señal de datos
5 PGC Señal de reloj
6 NC No conectada

4. Controlador cuyo firmware se encarga de realizar las tareas de Depuración/Grabación, y


de la comunicación con el PC. Emula y es compatible con el PICkit-2 de Microchip.
5. Conmutador para la selección del modo de trabajo. Su esquema se resume en la
siguiente figura. Tiene tres posiciones o modos:

(a) ICSP: Se selecciona para trabajar con un sistema de


depuración externo al USB-PIC’School. Éste se debe
conectar mediante el conector RJ11 (3).

(b) RUN: Se emplea cuando el controlador ya está


debidamente grabado con un programa totalmente funcional,
que no necesita del sistema de Depuración/Grabación.
Todas las líneas de E/S del PIC están a disposición de los
periféricos.

(c) USB: Es el modo que seleccionarás cuando estés en


fase de Depuración y/o de Grabación desde el PC.

P-5.2.2 Limitaciones durante la Depuración / Grabación

Durante el proceso de depuración, cuando el conmutador se coloca en la posición USB (o ICSP),


son tres las líneas de E/S de nuestro controlador que se emplean para la transferencia de información con el
PC: MCLR/RE0, RB6/ICSPCLK y RB7/ICSPDAT.

Así pues, los periféricos que en ellas estuvieran conectados no funcionarán. Esto lo debes tener en
cuenta cuando vayas a depurar los siguientes ejemplos que se van a proponer. No pienses que los
ejemplos no funcionan correctamente, lo que ocurre es que esas líneas no están a disponibles en ese
momento.

Sin embargo, tras el proceso de Depuración/Grabación, el conmutador lo puedes poner e la posición


RUN. En este momento esas líneas de E/S se conectan con los periféricos y éstos funcionarán
correctamente según las directrices del programa.

En depuración hay también otras limitaciones:

 Únicamente se puede hacer depuración con aquellos controladores que integren en sí


mismos estas capacidades. Esto NO ocurre con todos los modelos, especialmente los
más antiguos como el entrañable PIC16F84.
 El número de puntos de parada o breakpoints que se pueden emplear durante la
depuración, depende del modelo de PIC. En el caso particular del PIC16F886
únicamente disponemos de uno (suficiente para nuestros propósitos).
 El propio mecanismo de depuración consume parte de la memoria de programa y de
datos del PIC. No puedes por tanto hacer uso de ellas.

5-19
www.mkelectronica.com Microcontroladores PIC: Nivel I
En general, las herramientas de depuración son herramientas de coste bajo/medio que implican
algunas limitaciones. Recuerda que también existen los llamados “Emuladores” como por ejemplo el REAL-
ICE. Estas herramientas profesionales no tienen limitación alguna, por lo que son muy flexibles, potentes
y… caras.

Cuando se está en depuración NO se puede estar en grabación y viceversa. Se trata del mismo
hardware (compatible PICkit-2) pero con funciones diferentes. En el MPLAB-IDE tendrás que activar una u
otra según te interese. Aprenderás cómo hacerlo.

P-5.3 EJEMPLO 5-1: Control básico de las E/S

Este primer ejemplo no puede ser más sencillo. Trata de leer el estado de los
interruptores/pulsadores E5:E0 del laboratorio y reflejarlo sobre los leds de salida S5:S0. Es decir, leer las
entradas y actuar sobre las salidas.

P-5.3.1 Descripción / Edición del programa fuente

En primer lugar decir que de momento te puedes olvidar de estas directivas del ensamblador. Con
ellas se ajustan las palabras de configuración del controlador que establecen sus condiciones de trabajo. Lo
vas a estudiar más adelante, así que por ahora te lo crees.

__config _CONFIG1, LVP_OFF&_PWRTE_ON&_WDT_OFF&_EC_OSC&_FCMEN_OFF&_BOR_OFF


__config _CONFIG2, _WRT_OFF

La siguiente secuencia de instrucciones se encarga de configurar los puertos de entrada y salida.


Las entradas se conectan con las líneas RA<5:0> del puerta A y los leds de salida con las líneas RB<5:0>
de la puerta B. Esta secuencia es muy parecida a la mostrada en el área de teoría.

Inicio clrf PORTB ;Borra los latch de salida


bsf STATUS,RP0
bsf STATUS,RP1 ;Selecciona banco 3
clrf ANSEL ;Puerta A digital
clrf ANSELH ;Puerta B digital
bcf STATUS,RP1 ;Selecciona banco 1
clrf TRISB ;RB7:RB0 se configuran como salida
movlw b'11111111'
movwf TRISA ;RA5:RA0 se configuran como entrada
bcf STATUS,RP0 ;Selecciona banco 0

La instrucción “clrf PORTB” pone inicialmente a un estado conocido, el “0”, las que serán patillas de
salida. Se evita así que, cuando éstas se configuren como tal, los periféricos que en ellas estuvieran
conectados, se descontrolen aleatoriamente.

A continuación se selecciona el banco 3 para poder acceder a los registros ANSEL y ANSELH.
Éstos se borran mediante “clrf”, con lo que las puertas A y B se configuran como puertas digitales.
Seguidamente se selecciona el banco 1 que permite el acceso a los registros TRISB y TRISA. El primero se
pone a cero, con lo que la puerta B queda configurada, toda ella, como salida. Por su parte, el TRISA se
carga con niveles “1”, por lo que toda la puerta A se configura como entradas. Realmente esta operación no
es necesaria ya que en la secuencia de inicio, tras conectar la alimentación (Power On Reset), todas las
puertas se configuran como entradas en alta impedancia por defecto. Así, los periféricos que estuvieran
conectados, quedarán inactivos. Por último se selecciona el banco 0, lo que permitirá, en el futuro, acceder
a los registros propios de las puertas A y B.

La siguiente secuencia de instrucciones forma el cuerpo principal del programa. Como puedes ver el
ejemplo en sí es muy sencillo.

5-20
www.mkelectronica.com Microcontroladores PIC: Nivel I
Loop movf PORTA,W ;Leer las entradas RA0-RA5
movwf PORTB ;Reflejar en las salidas
goto Loop ;Bucle sin fin

Lee el estado actual de la puerta A de entrada (donde están físicamente conectados los
interruptores y pulsadores del laboratorio) y lo guarda en el registro W. A continuación el registro W se
deposita sobre la puerta B donde están conectados físicamente los leds. Mediante “goto Loop” el ciclo se
repite de forma indefinida.

Como consecuencia de ejecutar este programa, cuando un interruptor de la puerta A introduce un


nivel “1”, su correspondiente led en la puerta B se activa. Si introduce un “0”, se apaga. A la velocidad que
trabaja el controlador, la respuesta de los led de salida respecto a los interruptores de entrada, es
instantánea.

P-5.3.2 Proyecto y ensamblado

Esto te sonará de las unidades anteriores. Mediante Project  Wizard creas un proyecto al que
llamarás “Ejemplo 5-1” y al que debes asociar el programa fuente “Ejemplo 5-1.asm”. Con el comando
Project  Make (F10) lo ensamblas y obtienes el correspondiente programa ejecutable “Ejemplo 5-1.hex”
junto con otros ficheros auxiliares.

Ahora es el momento también de abrir las ventanas que consideres oportunas y colocarlas en el
área de trabajo como mejor te convenga. En esta ocasión opino que, junto a la ventana de Edición que
contiene el programa fuente, y la ventana Output con los mensajes de salida, abras la ventana Watch
donde puedes visualizar/modificar los registros o variables empleadas. En este caso se trata de visualizar
simplemente los registros especiales (SFR) correspondientes al PCL, acumulador (WREG), la Puerta A
(PORTA) y la Puerta B (PORTB). Sugiero que los visualices en binario. Para ello, los seleccionas con el
botón derecho del ratón, y luego ejecutas Properties  Format  Binary. Podría quedarte algo así como
esto:

5-21
www.mkelectronica.com Microcontroladores PIC: Nivel I
No te olvides de salvar el proyecto mediante Project  Save Project y de cerrarlo correctamente
cuando acabes la sesión de trabajo mediante Project  Close

P-5.3.3 Montaje eléctrico

¡¡ Esto es nuevo !! A partir de ahora vas a ejecutar los programas de forma REAL y con periféricos
REALES, no vas a hacer simulación como en los ejemplos de las unidades anteriores. Así que tienes
trabajo. Hay que conectar físicamente los interruptores de entrada a la puerta A y los leds de salida a la
puerta B. Aquí es cuando se aprecia la ayuda que nos puede brindar un buen laboratorio experimental como
es el USB-PIC’School. Con sencillas conexiones puedes montar rápidamente el hardware necesario.

La figura te muestra el esquema eléctrico de


E0 RA0 S0 RB0
conexiones. El laboratorio USB-PIC’School dispone
de 4 interruptores E0-E3 que se conectan con las E1 RA1 S1 RB1

entradas RA0-RA3 y otros tantos pulsadores, de los E2 RA2 S2 RB2

cuales E4 y E5 se conectan con las entradas RA4 y E3 RA3 S3 RB3


RA5. También dispone de 8 leds, S0-S7, que E4 RA4 S4 RB4
permiten representar valores binarios. Un led RA5 RB5
E5 S5
encendido significa un nivel “1”, apagado un nivel
E6 S6
“0”. En este ejemplo conectarás los leds S0-S5 con
E7 S7
las salidas RB0-RB5 de la puerta B.
E. DIGITALES
SALIDAS DIGITALES

En la siguiente fotografía tienes el montaje práctico. Las


conexiones se realizan empleando sencillos cables
rígidos de 0,6 mm de grosor. Éstos se insertan en los
bloques de conexión del laboratorio. Todo ello de forma
rápida, fiable y sin soldadura.

Conecta ahora la alimentación del entrenador y el cable


USB que lo enlazará con el PC.

P-5.3.4 Ejecución / Depuración

Es el momento de elegir la herramienta de


depuración. En primer lugar asegúrate de que el
conmutador del laboratorio se encuentra en la
posición USB.

Así como antes elegías el simulador MPLAB-


SIM, ahora vas a seleccionar el depurador PICKit-2
mediante Debugger  Select Tool como se muestra
en la figura de la derecha.

La ventana Output muestra una serie de mensajes cada vez que se establece la
comunicación entre el MPLAB-IDE y el laboratorio de prácticas

5-22
www.mkelectronica.com Microcontroladores PIC: Nivel I
Informan que se ha establecido conexión con el
PICkit-2 (compatible con el depurador del laboratorio
USB-PIC’School) y de la versión del firmware
interno.

También detecta la presencia del dispositivo


PIC16F886 así como su tensión de alimentación.

En el ángulo superior derecho de la ventana del MPLAB-IDE


aparecen 4 nuevos botones que no has visto hasta ahora:

1. PICkit 2 Connection. Este botón reestablece la conexión USB entre el PICkit 2 y el PC.
Ocasionalmente ésta puede perderse debido a la transferencia de información.

2. Program the target device. Una vez ensamblado o compilado el programa fuente, este
botón transfiere a la memoria de programa del PIC, el correspondiente programa
ejecutable. También transfiere las directivas y funciones internas para su depuración.

3. Read target device memories. Lee el contenido de las diferentes áreas de memoria del
PIC y lo transfiere a las correspondientes ventanas del MPLAB-IDE.

4. Read the target EEPROM memory. Lee el contenido de la memoria EEPROM de datos
del PIC.

Los que vas a usar con más frecuencia son el 1 y el 2. Utilízalos ahora para establecer la
conexión y, sobre todo, para transferir el programa recién ensamblado.

También aparecen los botones de


depuración/ejecución. Son los mismos que
has estado empleado en la simulación de
los programas de ejemplo de las unidades
anteriores. ¿Te acuerdas de ellos? Vamos a
repasarlos de nuevo:

1. Run. Ejecución en tiempo real hasta un breakpoint o punto de parada (si lo hubiera)
2. Halt. Detener la ejecución
3. Animate. Ejecución con animación
4. Step Into. Ejecución paso a paso
5. Step Over. Ejecución de un bloque de instrucciones (subrutina)
6. Step Out. Finalizar la ejecución de un bloque de instrucciones (subrutina)
7. Reset. Provocar un RESET en el microcontrolador
8. Breakpoints. Establecer un punto de parada

Ahora vamos con la ejecución / depuración del “Ejemplo 5-1.asm”. La verdad es que no hay grandes
novedades y esto ya lo conoces.

EJECUCIÓN PASO A PASO

Si ejecutas paso a paso, mediante Step Into, podrás ver exactamente la evolución del programa
conforme se van ejecutando sus instrucciones. Observa que, justo cuando se ejecuta la instrucción “Loop
movf PORTA,W”, tanto el registro W como la propia puerta A se actualizan con el valor actual de los
interruptores de entrada. Sin embargo cuando se ejecuta la instrucción “movwf PORTB” los leds de salida
se actualizan inmediatamente, pero el registro propio de la puerta B se actualiza un ciclo de instrucción más

5-23
www.mkelectronica.com Microcontroladores PIC: Nivel I
tarde. Son cosas del depurador cuando transmite la información desde nuestro PIC hasta el MPLAB. No
tiene mayor importancia.

EJECUCIÓN CON BREAKPOINT

El empleo de un punto de parada o breakpoint en la instrucción “goto Loop” te permitirá que, cada
vez que acciones el botón Run, la ejecución se detenga siempre que se produzca un ciclo completo: lectura
de la puerta A de entrada y escritura sobre la puerta B de salida. Observa que el PC (flecha verde) se
coloca justo en la siguiente instrucción que toca ejecutar, en este caso en la instrucción “Loop movf
PORTA,W”. Prueba a cambiar de estado los interruptores del laboratorio antes de ejecutar un nuevo ciclo
del programa.

EJECUCIÓN EN TIEMPO REAL

Si ejecutas en tiempo real, mediante el comando Run, verás que los leds de salida representan el
mismo valor binario que aplicas con los interruptores de entrada. Basta con cambiar el estado de cualquiera
de ellos, para ver que el correspondiente led también cambia de forma instantánea. Puedes detener la
ejecución mediante el comando Halt. En este instante el estado de los leds de salida debe coincidir con el
valor presente en el registro de la puerta B de la ventana Watch. Este valor debe ser el mismo que el de la
puerta A, que a su vez coincide con el estado actual de los interruptores de entrada.

EJECUCIÓN ANIMADA

Emplearás para ello el botón Animate. Observa cómo se van ejecutando todas las instrucciones y
cómo tanto los bits de los registros de las puertas A y B, así como los leds de salida, se van modificando al
tiempo que tu cambias de estado las entradas mediante los interruptores del laboratorio.

P-5.3.5 Grabación del dispositivo

Esto también es nuevo y sería el paso final en el desarrollo de un programa: grabarlo en la memoria
flash del controlador. Los sistemas de depuración y de grabación son diferentes. Cuando antes, hacías
depuración, no sólo transferías al PIC el programa ensamblado, también se transfieren (de forma
transparente para ti) una serie de rutinas y directivas propias de la depuración. Sin embargo, cuando grabas
un PIC, se graba única y exclusivamente tu programa.

Vas a utilizar la misma herramienta, el PICkit-2, pero su funcionamiento es distinto. Por ello, cuando
vayas a hacer depuración, debes deshabilitar el grabador y viceversa. Ahora vas a grabar. Tal y como se
muestra en la figura, primero deshabilitas el depurador mediante Debugger  Select Tool  None y luego
habilitas el grabador mediante Programmer  Select Programmer  PICkit 2.

5-24
www.mkelectronica.com Microcontroladores PIC: Nivel I
¡No te olvides de hacer el proceso inverso cuando necesites nuevamente del depurador!

Una vez seleccionado el PICkit 2 como sistema de grabación, el MPLAB-IDE visualiza los botones
correspondientes. Mira la figura. Algunos de ellos son parecidos a los que ya has empleado.

1. PICkit 2 Connection. Este botón restablece la conexión USB entre el PICkit 2 (USB-
PIC’School) y el PC. Ocasionalmente ésta puede perderse debido al trasiego de
información.
2. Program the target device. Graba las diferentes áreas de memoria del PIC con el
programa ejecutable recién ensamblado o compilado.
3. Read target device memories. Lee el contenido de las diferentes áreas de memoria del
PIC y lo transfiere a las correspondientes ventanas del MPLAB-IDE.
4. Read the target EEPROM memory. Lee el contenido de la memoria EEPROM de datos
del PIC.
5. Verify the contents of the target devide. Comprueba que el contenido de las diferentes
áreas de memoria del PIC coinciden con el contenido en las correspondientes ventanas
del MPLAB-IDE.
6. Erase the target device memories. Borra las diferentes áreas de memoria del
controlador.
7. Verify the target memories are erased. Comprueba que las diferentes áreas de
memoria del PIC están borradas.
8. Bring target MCLR to Vdd. Pone a nivel “1” la señal MCLR del controlador.
9. Bring MCLR to Vil. Pone a nivel “0” la señal MCLR del controlador.

Si ya tienes un programa debidamente ensamblado y depurado, debes suponer que funciona


correctamente. Es entonces cuando debes proceder a grabarlo. Basta con pulsar el botón 1 para establecer
la comunicación (si no lo estuviera) y el 2 para grabar. Son los dos botones que vas a emplear con más
frecuencia.

P-5.3.6 Comprobaciones finales

Es la prueba de fuego. Es de suponer que, una vez que grabas el PIC con un programa funcional,
éste debe ejecutarse sin ningún tipo de vínculo con el PC, y de forma totalmente autónoma. Lo puedes
comprobar de forma muy sencilla.

1. Coloca el conmutador del laboratorio en la posición central, RUN. De esta forma el PIC queda
aislado de los circuitos de grabación y/o depuración.

2. Haz un RESET mediante el pulsador y comprueba el funcionamiento. Cambia el valor de los


interruptores de entrada conectados a la puerta A, y observa que dicho cambio se refleja de forma
instantánea en los leds de salida conectados en la puerta B.

3. ¿Funciona? Bien. Desconecta ahora el cable USB que enlaza el laboratorio con el PC. Pulsa
RESET de nuevo y vuelve a comprobar su funcionamiento. Está claro que el controlador es
independiente respecto al PC.

4. ¿Funciona? Mejor. Para que veas que no hay trampa, desconecta ahora la alimentación y la
vuelves a conectar. No hace falta que pulses RESET ya que se produce automáticamente en la
secuencia de encendido. Es lo que se conoce como el “Power On Reset” (POR). Limítate a
comprobar su correcto funcionamiento.

5-25
www.mkelectronica.com Microcontroladores PIC: Nivel I
5. ¿Funciona? Perfecto. Esto demuestra que el PIC es totalmente autónomo. Quizá sea la hora de
hacer un hardware específico, pequeño y económico con ese PIC al que simplemente le
conectamos los interruptores, los leds, la alimentación y poco más, o quizás optes por emplear
tarjetas comerciales de propósito general como la PIC’Control, pero eso ya es otra historia.

¡Enhorabuena! Ya has conseguido hacer un proyecto, sencillo


pero real, desde el principio hasta el fin. Hay que reconocer que todo lo
explicado es un tanto espeso, especialmente para los lectores o usuarios
noveles. Si éste es tu caso, es recomendable que vuelvas a repasar
todas las fases que has realizado en este sencillo ejemplo, antes de
continuar con los siguientes. De todas formas es de esperar que, con la
colección de ejemplos que se van a proponer, terminarás haciendo todas
las tareas de forma casi automática.

P-5.3.7 Ahora tú

Este ejemplo es tan sencillo que pocas modificaciones vas a poder realizar. Puedes hacer algún tipo
de cálculo aritmético/lógico con el valor binario que lees desde los interruptores de entrada conectados a las
patillas de la Puerta A. El resultado lo visualizas, también en binario, sobre los leds de salida conectados en
las patillas de la Puerta B.

En el programa principal, entre la instrucción de leer la Puerta A (“Loop movf PORTA,W)”, y la de


escribir sobre la Puerta B (“movwf PORTB”), intercalas la instrucción apropiada según el cálculo que vayas
a realizar. No te olvides de que cada vez que modificas el programa fuente, lo debes ensamblar
nuevamente.

Completa la siguiente tabla con los resultados que obtienes en la Puerta B según el cálculo
realizado, y a partir de los valores binarios de entrada sugeridos en la Puerta A.

CALCULO VALORES BINARIOS DE ENTRADA EN LA PUERTA A


REALIZADO xx001100 xx101010 xx010101 xx000000 xx001000 xx000011 xx010100
andlw b’00111100’
iorlw b’00010001’
xorlw b’00110011’
addlw b’00000100’
sublw b’00110000’

P-5.4 EJEMPLO 5-2: Salida invertida

Aquí tienes otro ejemplo casi tan sencillo como el anterior. Vas a emplear instrucciones orientadas
al bit para chequear una entrada y actuar sobre las salidas. En este caso se chequea el bit 0 de la puerta A
(patilla RA0) de entrada, que se supone conectado con el interruptor E0 del laboratorio. Si está a nivel “0” se
desactiva el led de salida S0 conectado a la patilla RB0 de la puerta B, al tiempo que se activa el led de
salida S1 conectado a RB1. Si la entrada RA0 está a nivel “1” se invierten las salidas.

En resumidas cuentas, el led S0 refleja el estado del interruptor E0 mientras que el led S1 refleja su
estado invertido (función NOT).

Los pasos o fases de trabajo que vas a seguir con este ejercicio son muy parecidos a los que ya
conoces y siempre serán los mismos que para el resto de los ejemplos.

5-26
www.mkelectronica.com Microcontroladores PIC: Nivel I
P-5.4.1 Descripción/Edición del programa fuente

La secuencia de instrucciones para configurar los puertos de entrada y salida es muy parecida a la
empleada en el ejemplo anterior. El cuerpo principal del programa es el siguiente:

Loop btfsc PORTA,0 ;RA0 (E0) = 1 ??


goto RA0_es_1 ;Si
bcf PORTB,0 ;No, desactiva RB0 (S0)
bsf PORTB,1 ;Activa RB1 (S1)
goto Loop ;Repite constantemente el chequeo de RA0 (E0)
RA0_es_1 bsf PORTB,0 ;Activa RB0 (S0)
bcf PORTB,1 ;Desactiva RB1 (S1)
goto Loop ;Repite constantemente el chequeo de RA0 (E0)

La instrucción “btfsc PORTA,0” chequea el estado lógico de la línea RA0 conectada con el
interruptor E0. Si está a “1” se ejecuta la instrucción “goto RA0_es_1”, donde la línea RB0 se pone a “1” (se
activa el led S0) y RB1 se pone a “0” (se desactiva el led S1). Si está a “0”, la línea RB0 se pone a “0” (se
desactiva el led S0) y RB1 se pone a “1” (se activa el led S1). El proceso se repite de forma indefinida.

P-5.4.2 Proyecto y Ensamblado

Mediante Project  Wizard creas un proyecto al que llamarás “Ejemplo 5-2” y al que asocias el
programa fuente “Ejemplo 5-2.asm”. Con el comando Project  Make (F10) lo ensamblas y obtienes el
correspondiente programa ejecutable “Ejemplo 5-2.hex” junto con otros ficheros auxiliares.

Abre las ventanas que te interesen. Como mínimo es recomendable tener abierta la ventana con el
programa fuente y la ventana Output de salida. A partir de ahora queda a tu elección el abrir o no la
ventana Watch para que visualices los registros que consideres oportunos y en el formato que mejor te
venga (binario, decimal, hexadecimal, etc...).

No te olvides de salvar el proyecto mediante Project  Save Project y de cerrarlo correctamente


cuando acabes la sesión de trabajo mediante
Project  Close
E0 RA0 S0 RB0

P-5.4.3 Montaje eléctrico E1 S1 RB1

E2 S2

La figura muestra el esquema de E3 S3


conexiones. El interruptor E0 se conecta con la línea E4 S4
de entrada RA0 que actuará como entrada. E5 S5

E6 S6
Los leds de salida S0 y S1 del laboratorio se
E7 S7
conectan con las líneas RB0 y RB1 que actuarán
E. DIGITALES
como salidas. SALIDAS DIGITALES

P-5.4.4 Ejecución/depuración

Asegúrate de que el conmutador del laboratorio se encuentra en la posición USB y que está
conectado con el puerto USB del PC. A continuación selecciona en el MPLAB-IDE, la herramienta de
depuración mediante Debugger  Select Tool  PICkit2. En la ventana Output nos debe aparecer un
mensaje de la conexión entre el MPLAB y el laboratorio USB-PIC’School, así como la identificación del
PIC16F886 con el que estás trabajando.

Con el botón Program the target device transfiere al PIC el programa que acabas de ensamblar y
que vas a depurar y/o ejecutar. Ocasionalmente, quizá debas usar el botón Connection si observas que se

5-27
www.mkelectronica.com Microcontroladores PIC: Nivel I
ha perdido la comunicación entre el MPLAB-IDE y el laboratorio. También es interesante que pulses el
botón Reset para asegurar el inicio de la ejecución desde el principio.

A partir de este momento estás listo para comenzar con la ejecución del programa. Puedes usar los
recursos que has utilizado en ejemplos anteriores: ejecución en tiempo real, ejecución paso a paso o con
puntos de parada (breakpoints). Tienes la oportunidad de emplear esos recursos, sobre todo, para aprender
y familiarizarte con ellos.

P-5.4.5 Grabación del dispositivo

Éste es el paso final en el desarrollo de un programa: grabarlo en la memoria FLASH de programa


del controlador. Ahora vas a emplear el laboratorio USB-PIC’School en el modo grabador. Para ello, primero
deshabilita el depurador mediante Debugger  Select Tool  None y luego habilita el grabador mediante
Programmer  Select Programmer  PICkit 2.

¡No te olvides de hacer el proceso inverso si necesitas nuevamente del depurador!

Mediante el botón Program the target device graba el programa en la memoria flash del
controlador.

P-5.4.5 Comprobaciones finales

Coloca el conmutador del laboratorio en la posición central RUN. De esta forma el PIC queda
aislado del sistema de grabación y/o depuración. Haz un RESET mediante el pulsador y comprueba el
funcionamiento. El led S0 tendrá el mismo nivel lógico que el interruptor E0 y el led S1 su inverso o
complemento. Esta misma prueba la puedes hacer desconectando el cable USB del laboratorio,
desconectando su alimentación y volviéndola a conectar. Con ello certificas la total autonomía del PIC.

P-5.4.6 Ahora tú

Si ejecutas el programa en tiempo real, tal y como está, te parecerá que funciona correctamente. S0
es igual a E0 y S1 es el complemento de E0. Sin embargo, te aseguro que el programa no es del todo
correcto. Hay un fallo que sólo lo puedes apreciar (si no lo has hecho ya) cuando lo ejecutas paso a paso.

Describe a continuación en qué consiste el fallo, y completa la tabla con las modificaciones que
debieras de hacer en el programa original para corregirlo.

____________________________________________________________________________________

____________________________________________________________________________________

____________________________________________________________________________________

PROGRAMA ORIGINAL PROGRAMA MODIFICADO


Loop btfsc PORTA, 0
goto RA0_es_1
bcf PORTB,0
bsf PORTB,1
goto Loop
RA0_es_1 bsf PORTB,0
bsf PORTB,1
goto Loop

5-28
www.mkelectronica.com Microcontroladores PIC: Nivel I
P-5.5 EJEMPLO 5-3: Decodificador digital

Un ejemplo con evidente utilidad práctica en aplicaciones digitales. Se trata de hacer el clásico
circuito combinacional como es un decodificador. En función de un código de entrada de 2 bits, se trata de
obtener una serie de señales de salida según la siguiente tabla de la verdad.

ENTRADAS SALIDAS
RA1 RA0 RB7 RB6 RB5 RB4 RB3 RB2 RB1 RB0
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

P-5.5.1 Descripción/Edición del programa fuente

Dado que son similares a las empleadas en los ejemplos anteriores, dejamos a un lado la secuencia
de instrucciones para la configuración de las puertas de E/S. Así, el cuerpo principal del programa es el
siguiente:

Loop: movf PORTA,W ;Leer el puerto de entrada


andlw b'00000011' ;Máscara para las líneas RA0 y RA1
btfsc STATUS,Z ;Están a 00 ?
goto Valen_00 ;Si
movwf Temp ;No, almacena el resultado temporalmente
movlw b'00000001'
subwf Temp,W ;Compara con 01
btfsc STATUS,Z ;Están a 01 ?
goto Valen_01 ;Si
movlw b'00000010' ;No
subwf Temp,W ;Compara con 10
btfsc STATUS,Z ;Están a 10 ?
goto Valen_10 ;Si

Una vez que se leen los 8 bits de la puerta A de entrada, la instrucción “andlw b’00000011’” pone
los 6 bits de más peso a “0” respetando únicamente los bits 1 y 0 que son los que tenemos que chequear.
Es lo que se denomina poner una “máscara”. Si esa instrucción genera un 0 como resultado, es porque las
dos entradas RA1:RA0 también lo estaban. En este caso se ejecuta la instrucción “goto Valen_00” y se
saca por la puerta B de salida el valor acordado según la tabla de la verdad. Si no es así, los bits de la
puerta A de entrada se van comparando con 01, con 10 y, si no es ninguno de esos valores, es porque
valen 11. A cada posible valor de las entradas RA1:RA0 le corresponde un valor de salida por la puerta B.

P-5.5.2 Proyecto y Ensamblado

Mediante Project  Wizard crea un proyecto al que llamarás “Ejemplo 5-3” y al que asociarás el
programa fuente “Ejemplo 5-3.asm”. Con el comando Project  Make (F10) lo ensamblas para obtener el
correspondiente programa ejecutable “Ejemplo 5-3.hex”.

Abre las ventanas que te interesen. Como mínimo, es recomendable tener abierta la ventana con el
programa fuente y la ventana Output de salida. Queda a tu criterio abrir o no la ventana Watch para que
visualices los registros que consideres oportunos.

No te olvides de salvar el proyecto mediante Project  Save Project y de cerrarlo correctamente


cuando acabes la sesión de trabajo mediante Project  Close. Te puede quedar un entorno de trabajo
similar al de la figura.

5-29
www.mkelectronica.com Microcontroladores PIC: Nivel I
P-5.5.3 Montaje eléctrico

E0 RA0 S0 RB0

E1 RA1 S1 RB1

E2 S2 RB2 En la figura tienes el esquema de conexiones.


E3 S3 RB3 Los interruptores E1:E0 se conectan con las líneas
E4 S4 RB4
de entrada RA1:RA0 respectivamente. Por su
parte los leds reflejarán el valor binario de salida
E5 S5 RB5
en función de las entradas. S7:S0 se conectan con
E6 S6 RB6
las líneas RB7:RB0 de la puerta B.
E7 S7 RB7

E. DIGITALES
SALIDAS DIGITALES

P-5.5.4 Ejecución/depuración

Pon el conmutador del laboratorio en la posición USB y conéctalo con el puerto USB del PC. A
continuación selecciona en el MPLAB-IDE la herramienta de depuración mediante Debugger  Select
Tool  PICkit2.

Con el botón Program the target device transfiere al PIC el programa que acabas de ensamblar y
que vas a depurar y/o ejecutar. Ocasionalmente, quizá debas usar el botón Connection, si observas que se
ha perdido la comunicación entre el MPLAB-IDE y el laboratorio. También es interesante que pulses el
botón Reset para asegurar el inicio de la ejecución desde el principio.

A partir de este momento estás listo para comenzar con la ejecución del programa. Puedes usar los
recursos ya conocidos: ejecución en tiempo real, ejecución paso a paso o con puntos de parada
(breakpoints).

5-30
www.mkelectronica.com Microcontroladores PIC: Nivel I
¡Importante! Hay que recordar que en el modo de depuración, cuando el conmutador se encuentra
en la posición USB, las líneas RB6 y RB7 quedan desconectadas de los periféricos (en este caso de
los leds S6 y S7). Las emplea el propio sistema de depuración para la transferencia de información
entre el PIC y el MPLAB-IDE. Observarás que no funcionan según tu programa. Es normal.

P-5.5.5 Grabación del dispositivo

Para grabar, primero deshabilita el depurador mediante Debugger  Select Tool  None y luego
habilita el grabador mediante Programmer  Select Programmer  PICkit 2.

¡No te olvides de hacer el proceso inverso si necesitas nuevamente del depurador!

Mediante el botón Program the target device graba el programa en la memoria FLASH del
controlador.

P-5.5.6 Comprobaciones finales

Coloca el conmutador del laboratorio en la posición central RUN. De esta forma el PIC queda
aislado del sistema de grabación y/o depuración. Ahora sí que las líneas RB6 y RB7 deben funcionar de
acuerdo a las exigencias del programa. Haz un RESET mediante el pulsador y comprueba el
funcionamiento. Según sea el valor de los interruptores E1:E0 se activarán los leds S7:S0 de salida de
acuerdo a la tabla de la verdad.

Esta misma prueba la puedes hacer desconectando el cable USB del laboratorio, desconectando su
alimentación y volviéndola a conectar. Con ello compruebas la total autonomía del PIC.

P-5.5.7 Ahora tú

Este proyecto se presta a múltiples modificaciones. Por ejemplo, puedes implementar el clásico
decodificador/selector tan utilizado en sistemas digitales. Empieza haciendo un decodificador/selector 2 x
4. El funcionamiento se resume en la siguiente tabla. En este tipo de circuitos sólo puede estar activa una
salida por cada código o combinación de entrada.

DECODIFICADOR DE 2 x 4
ENTRADAS SALIDAS
RA1 (E1) RA0 (E0) RB3 (S3) RB2 (S2) RB1 (S1) RB0 (S0)
0 0 0 0 0 1
0 1 0 0 1 0
1 0 0 1 0 0
1 1 1 0 0 0

¿Te atreves a hacer un decodificador/selector de 3 x 8?

P-5.6 EJEMPLO 5-4: Automatismo

Otro ejemplo con unas claras posibilidades reales. Se trata de simular la automatización de un
sencillo sistema de envasado como el mostrado en la figura. Un motor, M1, controlado desde la salida RB0,
mueve una cinta que transporta piezas. Otro motor, M2, controlado desde la salida RB1, mueve otra cinta
que transporta embalajes. El detector DP conectado con la entrada RA1 cuenta el número de piezas que
pasan por él. El detector DE conectado en la entrada RA2, detecta el posicionamiento de un embalaje. El
ciclo de trabajo comienza cuando se activa el interruptor I conectado con la entrada RA0.

5-31
www.mkelectronica.com Microcontroladores PIC: Nivel I
La cinta de embalajes controlada por M2 avanza hasta que DE se active al detectar un nuevo
embalaje correctamente posicionado. En este momento M2 se detiene y se activa M1 que mueve las piezas
a embalar, y que van cayendo en el envase. El detector DP las va contando. Cuando han pasado 10 piezas
(por ejemplo) se activa la señal acústica A conectada con la salida RB2. El motor M1 se detiene y M2 vuelve
a activarse hasta retirar el embalaje lleno y posicionar otro vacío. Se desconecta la señal acústica y el ciclo
se repite.

P-5.6.1 Descripción/Edición del programa fuente

El cuerpo principal del programa fuente es muy secuencial y sus instrucciones van ejecutando una a
una las maniobras explicadas anteriormente. En este sentido no hay nada nuevo, pero estúdialas con
atención. Sin embargo hay un par de nuevos detalles.

include "MSE_Delay.inc" ;Incluir rutinas de temporización

La directiva “include” ya la conoces. Sirve para incrustar o incluir en el programa fuente el contenido
de un fichero, en este caso el “MSE_Delay.inc”. Este fichero contiene una macro de temporización. Una
macro es un conjunto de instrucciones al que se le asigna un nombre y que se incrustan en nuestro
programa indicando simplemente dicho nombre. En este caso la macro se llama “Delay” y contiene una
serie de instrucciones cuya ejecución implica realizar una determinada temporización.

La llamada o utilización de esa macro se debe realizar con la siguiente sintaxis “Macro XX Milis”,
donde XX expresan el número de milisegundos que se desea temporizar. Observarás que en nuestro
programa fuente de ejemplo se emplea en varias ocasiones.

Puedes abrir el fichero “MSE_Delay.inc” para estudiar su contenido. En síntesis verás que,
básicamente, consiste en un bucle que ejecuta una serie de instrucciones con objeto de consumir un cierto
tiempo. Es bastante parecido al que se empleó en el ejemplo 4-3 de la Unidad 4 anterior. Con la macro
“Delay” se obtiene una precisión razonable con valores de temporización que van desde 1 hasta 2.000 mS y
con frecuencias (Fosc) que van desde 1 MHz hasta 48 MHz. De momento no te preocupes por ella,
simplemente limítate a utilizarla.

5-32
www.mkelectronica.com Microcontroladores PIC: Nivel I
Otro detalle es la definición de la constante:

#define Fosc 4000000 ;Velocidad de trabajo

Con esta constante definimos la velocidad a la que trabaja nuestro controlador (4MHz). Este valor lo
necesita la macro ”Delay” y en base a él se calcula los bucles que hay que realizar para conseguir la
temporización deseada.

Un último detalle es el siguiente:

MSE_Delay_V equ 0x70 ;Variables (3) empleadas por las macros de temporización

Hace una reserva de 3 posiciones de memoria RAM a partir de la etiqueta “MSE_Delay_V”, cuya
dirección inicial es 0x70. Esta reserva es empleada por las instrucciones de la macro “Delay”, que necesitan
de una serie de posiciones RAM donde guardar las variables de sus bucles.

El fichero “MSE_Delay.inc” y la macro “Delay” que contiene, será utilizado con mucha frecuencia en
los sucesivos ejemplos. En ellos verás que también se incluyen otros ficheros .INC con funciones y rutinas
que nos facilitarán el trabajo. Tiempo al tiempo.

P-5.6.2 Proyecto y Ensamblado

Mediante Project  Wizard crea un proyecto al que llamarás “Ejemplo 5-4”. Le asocias el programa
fuente “Ejemplo 5-4.asm”. Con el comando Project  Make (F10) ensámblalo para obtener el
correspondiente programa ejecutable “Ejemplo 5-4.hex”.

Abre las ventanas que creas necesarias. Como mínimo, es recomendable tener abierta la ventana
con el programa fuente y la ventana Output de salida. No te olvides de salvar el proyecto mediante Project
 Save Project y de cerrarlo correctamente cuando acabes la sesión de trabajo mediante Project  Close

P-5.6.3 Montaje eléctrico

En la siguiente figura tienes el esquema


con las conexiones eléctricas. Los interruptores E0, E0
(I)
RA0 S0
(M1)
RB0
E1 y el pulsador E4 simulan el interruptor (I) de E1
(DE)
RA2 S1
(M2)
RB1
puesta en marcha, el detector de embalajes (DE) y (A)
RB2
E2 S2
el detector de piezas (DP) respectivamente. Se
E3 S3
conectan con las entradas RA0, RA2 y RA1 de la (DP)
E4 RA1 S4
puerta A.
E5 S5

Los de salidas S0, S1 y S2 simulan el motor E6 S6

M1 (cinta de las piezas), el M2 (cinta de los E7 S7


embalajes) y la señal A de aviso. Se conectan con E. DIGITALES
SALIDAS DIGITALES
las salidas RB0, RB1 y RB2 de la puerta B.

P-5.6.4 Ejecución/depuración

Pon el conmutador del laboratorio en la posición USB y conéctalo con el puerto USB del PC. A
continuación selecciona la herramienta de depuración mediante Debugger  Select Tool  PICkit2. Con
el botón Program the target device transfiere al PIC el programa que acabas de ensamblar y que vas a
depurar y/o ejecutar.

5-33
www.mkelectronica.com Microcontroladores PIC: Nivel I
P-5.6.5 Grabación del dispositivo

Para grabar, primero deshabilita el depurador con Debugger  Select Tool  None y luego
habilitas el grabador usando Programmer  Select Programmer  PICkit 2.

¡No te olvides de hacer el proceso inverso si necesitas nuevamente del depurador!

Mediante el botón Program the target device graba el programa en la memoria FLASH del
controlador.

P-5.6.6 Comprobaciones finales

Coloca el conmutador del laboratorio en la posición central RUN. De esta forma el PIC queda
aislado del sistema de grabación y/o depuración. Trata de ponerte en el lugar del automatismo y actúa con
las entradas como si fueras la propia máquina que estás simulando. Observa las salidas.

Prueba a desconectar el cable USB del laboratorio t también la alimentación general. Vuelve a
conectar esa alimentación y comprueba el correcto funcionamiento de la aplicación. El controlador PIC
trabaja de forma totalmente autónoma.

P-5.6.7 Ahora tú

Este ejemplo se puede prestar a varias modificaciones. La más obvia es la de cambiar el número de
piezas a contar. Otra modificación más interesante consiste en eliminar del programa todas las llamadas a
la Macro “Delay”. No hace falta que las borres físicamente del programa fuente, basta con que pongas “;”
delante de cada una de ellas. Así serán consideradas como comentarios por parte del ensamblador.

Trata de ejecutar nuevamente el programa recién modificado, ensamblado y grabado. Observarás


un pequeño/gran fallo. ¿Te has fijado? Ahora parece que cuenta mal el número de piezas, parece que
cuenta de menos.

La respuesta a este problema está en los insidiosos “rebotes” que


producen los dispositivos electromecánicos como el pulsador con el que
estás simulando al detector de piezas. Aunque te parezca que sólo lo
accionas una vez, realmente en el interior del mecanismo se han
producido varios “micro- accionamientos”, hasta que sus piezas
mecánicas se estabilizan. Este efecto es conocido como “efecto Rebote”.
En la figura se representa cómo es la señal eléctrica que se genera cada
vez que accionas el pulsador (pulsar-soltar).

Durante un cierto tiempo t se producen una serie de micro pulsos con cada accionamiento. A la
velocidad que trabaja el controlador, estos pulsos son tomados en cuenta como pulsos válidos, por lo que la
cuenta aumenta en varias unidades con una única pulsación. Este tiempo t se mide en milisegundos y
depende fundamentalmente de la calidad del pulsador.

Una forma de eliminar los rebotes puede ser por hardware, mediante un condensador que forma
una red RC. Otra forma es mediante software, que es la que has empleado. Cada vez que se detecte un
flanco en la señal, se temporiza 10 mS antes de pasar a detectar el siguiente. Es de suponer que durante
ese tiempo el mecanismo ya se ha estabilizado. Puedes probar con diferentes valores de temporización
hasta conseguir el óptimo (cuanto menos mejor).

P-5.7 EJEMPLO 5-5: Juego de luces

Otro sencillo y vistoso ejemplo para acabar con esta unidad. En este caso se trata de hacer un
simple juego de luces. Los 8 leds S7:S0 conectados a las líneas RB7:RB0 de la puerta B de salida, se irán

5-34
www.mkelectronica.com Microcontroladores PIC: Nivel I
encendiendo, uno a uno de izquierda a derecha o de derecha a izquierda, en función del interruptor E0
conectado en RA0 de la puerta A de entrada.

P-5.7.1 Descripción/Edición del programa fuente

El cuerpo principal del programa fuente quizá te resulte familiar. Emplea las instrucciones de
rotación a izquierda o a derecha, que ya usaste en el ejemplo 4-5 de la Unidad 4 anterior.

Loop Delay 250 Milis ;Temporiza 250mS


btfsc PORTA,0 ;Está a 0 RA0 ??
goto A_Dcha ;No, rotación a derecha
A_Izda rlf PORTB,F ;Si, rotación a izquierda
goto Loop
A_Dcha rrf PORTB,F ;Rotación a derecha
goto Loop

Mediante “btfsc PORTA,0”, se comprueba el estado de la línea de entrada RA0, donde se ha


conectado el interruptor E0. Si está a nivel “0” se produce una rotación a la izquierda de la puerta B de
salida en la que se han conectado los leds S7:S0. Se irán encendiendo secuencialmente desde la derecha
hacia la izquierda. Si el interruptor está a “1” la rotación es desde la izquierda hacia la derecha.

Entre una rotación y otra se intercala una temporización de unos 250 mS mediante la macro “Delay”
que ya has usado en el ejercicio anterior. De esta forma se consigue que el efecto de movimiento sea
apreciable por nuestro ojo.

P-5.7.2 Proyecto y Ensamblado

Mediante Project  Wizard crea el proyecto “Ejemplo 5-5”. Le asocias el programa fuente “Ejemplo
5-5.asm”. Con el comando Project  Make (F10) lo ensamblas para obtener el programa ejecutable
“Ejemplo 5-5.hex”.

Como siempre, abres las ventanas que te interesen en tu entorno de trabajo. No te olvides de salvar
el proyecto mediante Project  Save Project y de cerrarlo cuando acabes la sesión de trabajo mediante
Project  Close

P-5.7.3 Montaje eléctrico

E0 RA0 S0 RB0

E1 S1 RB1 El esquema de conexiones lo tienes en la siguiente


E2 S2 RB2 figura. El interruptor E0 se conecta con la línea RA0
E3 S3 RB3 de la puerta A que actúa como entrada.
E4 S4 RB4

E5 S5 RB5
Los 8 leds S7:S0 se conectan con las líneas
E6 S6 RB6
RB7:RB0 de la puerta B que actúa como salida.
E7 S7 RB7

E. DIGITALES
SALIDAS DIGITALES

P-5.7.4 Ejecución/depuración

Pon el conmutador del laboratorio en la posición USB y conéctalo con el puerto USB del PC.
Selecciona la herramienta de depuración mediante Debugger  Select Tool  PICkit2. Con el botón
Program the target device transfiere al PIC el programa que acabas de ensamblar.

5-35
www.mkelectronica.com Microcontroladores PIC: Nivel I
A partir de este momento estás listo para comenzar con la ejecución del programa. Puedes usar los
recursos que hemos utilizado en ejemplos anteriores: ejecución en tiempo real, ejecución paso a paso o con
puntos de parada (breakpoints).

¡Importante! Hay que recordar que en el modo de depuración, cuando el conmutador se encuentra
en la posición USB, las líneas RB6 y RB7 quedan desconectadas de los periféricos (en este caso de
los leds S6 y S7). Las emplea el propio sistema de depuración para la transferencia de información
entre el PIC y el MPLAB-IDE. Observarás que no funcionan según tu programa. Es normal.

P-5.7.5 Grabación del dispositivo

Deshabilita el depurador mediante Debugger  Select Tool  None y luego habilita el grabador
mediante Programmer  Select Programmer  PICkit 2.

¡No te olvides de hacer el proceso inverso cuando necesites nuevamente del depurador!

Mediante el botón Program the target device graba el programa en la memoria FLASH del
controlador.

P-5.7.6 Comprobaciones finales

Coloca el conmutador del laboratorio en la posición central RUN. De esta forma el PIC queda
aislado del sistema de grabación y/o depuración. Comprueba el desplazamiento en el encendido secuencial
de cada uno de los leds, en función del estado del interruptor E0 conectado en RA0. Esta misma prueba la
puedes hacer desconectando el cable USB del laboratorio, desconectando su alimentación y volviéndola a
conectar. Todo ello para comprobar la total autonomía del controlador.

Observa que ahora los leds S7 y S6 funcionan según lo previsto. En la posición RUN del
conmutador, las líneas RB7 y RB6 se desconectan del sistema de depuración/grabación y se conectan con
los periféricos, en este caso los leds.

P-5.7.7 Trabajo personal

Este ejemplo se presta a que experimentes con tus capacidades visuales. Efectivamente, mediante
el empleo de la macro “Delay 250 Milis”, cada led permanece encendido 250 ms (0,25 s), lo que te permite
ver perfectamente la transición en cada uno. Pero ¿qué pasaría si quitamos o disminuimos esta
temporización? Te sugiero que hagas diferentes pruebas y completes la siguiente tabla para tener una
referencia. Conforme disminuyes el valor de la temporización, las rotaciones se van realizando más
rápidamente. Llega un momento en que tienes la sensación óptica de que todos los leds están encendidos.
La retina de nuestros ojos no es capaz de percibir las variaciones a esa velocidad. Más adelante nos
aprovecharemos de este mismo efecto óptico para la visualización sobre displays numéricos.

TEMPORIZACIÓN ¿QUÉ VES?

Delay 125 Milis

Delay 50 Milis

Delay 25 Milis

Delay 10 Milis

5-36
www.mkelectronica.com Microcontroladores PIC: Nivel I
P-5.8 ¿ALGO MÁS?

Pues sí, todavía puedes avanzar unos pasos más en cualquier proyecto. Piensa que el laboratorio
USB-PIC’School lo has usado como plataforma de experimentación y desarrollo. Has usado sus periféricos,
de momento sólo las entradas y salidas digitales (interruptores y leds), y también su sistema de depuración
y grabación. Con todo ello has depurado y puesto en marcha los distintos proyectos de ejemplo.

¿Cuál sería el siguiente paso? Si tu objetivo es hacer una aplicación final el siguiente paso que
debes hacer será desarrollar una tarjeta electrónica a medida. Una tarjeta que contenga únicamente al
propio controlador y a los periféricos que debe controlar, y que sea lo más pequeña y económica posible.

Vamos a hacerlo basándonos en el ejemplo 5-5, el juego de luces. Con el laboratorio ya


comprobaste su correcto funcionamiento. Ahora vas a desarrollar la tarjeta a medida.

P-5.8.1 Esquema eléctrico

Realmente en este proyecto necesitas muy pocos componentes: el controlador, el oscilador del
sistema, la alimentación, los leds de salida y el interruptor. Mira el esquema eléctrico de la figura. Laspatillas
RB7:RB0 del controlador PIC16F886 (U1) se conectan con los 8 leds de salida a través de las resistencias
de absorción de 220 Ω contenidas en el paquete RPACK 1.

8 x LED's ROJO 3 mm
16
15
14
13
12
11
10
9

RPACK 1
8 x 220
1
2
3
4
5
6
7
8

U3
+ 5 VCC
3 1
IN OUT
2
COM
9V
28
27
26
25
24
23
22
21
20
19
18
17
16
15

UA78L05
U1
RB7
RB6
RB5
RB4
RB3
RB2
RB1
RB0

RC7
RC6
RC5
RC4
VDD
GND

PIC16F886

C1
100n
CLKOUT/RA6
CLKIN/RA7
MCLR/RE3

GND

RC0
RC1
RC2
RC3
RA0
RA1
RA2
RA3
RA4
RA5
1
2
3
4
5
6
7
8
9
10
11
12
13
14

SW1
U2
IZD/DCH
3 2
OUT GND
4 1
VCC N.C.

OSC. 4 MHz

5-37
www.mkelectronica.com Microcontroladores PIC: Nivel I
El conmutador SW1 se conecta con la patilla de entrada RA0. Cuando se desplaza hacia la derecha
pone la patilla a nivel “0” (GND) y a la izquierda a nivel “1” (+5Vcc). Según el programa el encendido de los
leds se desplazará a la izquierda o a la derecha.

El oscilador U2 proporciona la frecuencia principal de trabajo de 4 MHz. Se aplica por la patilla RA7
que actúa como entrada de reloj externo. Más adelante verás que puedes omitir este oscilador externo ya
que el PIC tiene su propio oscilador interno. Con ello abaratarás los costes del producto final.

Por último el regulador de tensión uA78L05 (U3) obtiene la tensión general de trabajo de +5Vcc a
partir de la tensión de 9V que suministra una pila o batería.

P-5.8.2 Montaje práctico

Es posible que quieras hacer de tu proyecto un producto comercial. Entonces debieras diseñar una
tarjeta de circuito impreso donde soldarás los componentes con un acabado profesional. Podrás fabricarlo
en pequeñas, medianas y grandes series. También es posible que únicamente necesites una única tarjeta.
En cualquier caso deberás hacer lo que se llama un “prototipo” como se muestra en la figura.

En este caso se ha utilizado una tarjeta “Uniprint” de propósito general. Se han colocado y soldado
los componentes con la disposición adecuada, y luego se han cableado según el esquema eléctrico.

Ahora insertas en la nueva tarjeta el controlador con el programa de la aplicación recién grabado
sobre él. Recuerda que el programa ya lo depuraste y grabaste con el laboratorio USB-PIC’School (repasa
el párrafo P-5.7.5). Conecta la pila de 9 V y comprueba su funcionamiento de forma totalmente autónoma.

¡¡ Debes obtener los mismos resultados que obtuviste con el laboratorio !!

5-38
www.mkelectronica.com Microcontroladores PIC: Nivel I
UNIDAD 6: OTROS PERIFERICOS DIGITALES

OBJETIVOS

En la unidad anterior usaste por primera vez los puertos de entrada y/o salida para controlar
sencillos periféricos digitales como eran los interruptores/pulsadores y los leds del laboratorio USB-
PIC’School. Sin embargo hay infinidad de periféricos de carácter digital. Sir ir más lejos, nuestro laboratorio
dispone de una muestra muy representativa de ellos.

En esta unidad vas a trabajar con los displays de 7 segmentos, la pantalla LCD y el teclado
numérico. Realmente no vas a estudiar nuevas instrucciones, sino algunas técnicas que se emplean para
controlar esos periféricos tan importantes y utilizados, y que te abrirán las puertas a infinidad de proyectos y
aplicaciones.

Notarás que los ejemplos propuestos van adquiriendo una mayor complejidad. Más que complejos
son cada vez extensos. No debes extrañarte, es normal. Piensa que tu controlador está realizando tareas
más elaboradas. No es necesario que te estudies los programas al pie de la letra, pero sí que te quedes con
las ideas generales. Un mismo programa se puede resolver de múltiples formas diferentes, y las nuestras no
son las únicas ni las mejores. Te animo a que seas tú mismo el encargado de revisar y mejorar cualquiera
de los ejemplos.

ÁREA DE TEORÍA

T-6.1 LOS DISPLAYS DE 7 SEGMENTOS


T-6.1.1 Multiplexado de los displays
T-6.1.2 Ahora tú

T-6.2 LA PANTALLA LCD


T-6.2.1 Conexiones
T-6.2.2 Características eléctricas
T-6.2.3 Juego de instrucciones
T-6.2.4 Juego de caracteres
T-6.2.5 Los caracteres gráficos
T-6.2.6 La librería “LCD4bitsPIC16.inc”
T-2.6.7 Ahora tú

T-6.3 EL TECLADO
T-6.3.1 Exploración del teclado
T-6.3.2 La librería “Teclado.inc”
T-6.3.3 Ahora tú

ÁREA DE PRÁCTICAS

P-6.1 EJEMPLO 6-1: Control de un display


P-6.1.1 Descripción / Edición del programa fuente
P-6.1.2 Proyecto y ensamblado
P-6.1.3 Montaje eléctrico
P-6.1.4 Ejecución / Depuración
P-6.1.5 Grabación del dispositivo y comprobaciones finales
P-6.1.6 Ahora tú

P-6.2 EJEMPLO 6-2: Decodificador BCD a 7 segmentos


P-6.2.1 Descripción / Edición del programa fuente
P-6.2.2 Montaje eléctrico

6-1
www.mkelectronica.com Microcontroladores PIC: Nivel I
P-6.2.3 Ejecución / Depuración
P-6.2.4 Grabación del dispositivo y comprobaciones finales
P-6.2.5 Ahora tú

P-6.3 EJEMPLO 6-3: Multiplexado de los displays


P-6.3.1 Descripción / Edición del programa fuente
P-6.3.2 Montaje eléctrico
P-6.3.3 Ejecución / Depuración
P-6.3.4 Grabación del dispositivo y comprobaciones finales
P-6.3.5 Ahora tú

P-6.4 EJEMPLO 6-4: Década contador Up/Down


P-6.4.1 Descripción / Edición del programa fuente
P-6.4.2 Montaje eléctrico
P-6.4.3 Grabación del dispositivo y comprobaciones finales
P-6.4.4 Ahora tú

P-6.5 EJEMPLO 6-5: La pantalla LCD


P-6.5.1 Descripción / Edición del programa fuente
P-6.5.2 Montaje eléctrico
P-6.5.3 Grabación del dispositivo y comprobaciones finales
P-6.5.4 Ahora tú

P-6.6 EJEMPLO 6-6: Visualizando mensajes


P-6.6.1 Descripción / Edición del programa fuente
P-6.6.2 Montaje eléctrico
P-6.6.3 Grabación del dispositivo y comprobaciones finales
P-6.6.4 Ahora tú

P-6.7 EJEMPLO 6-7: Visualizando más mensajes


P-6.7.1 Descripción / Edición del programa fuente
P-6.7.2 Montaje eléctrico
P-6.7.3 Grabación del dispositivo y comprobaciones finales

P-6.8 EJEMPLO 6-8: El teclado


P-6.8.1 Descripción / Edición del programa fuente
P-6.8.2 Montaje eléctrico
P-6.8.3 Grabación del dispositivo y comprobaciones finales
P-6.8.4 Ahora tú

P-6.9 EJEMPLO 6-9: El teclado y la pantalla LCD


P-6.9.1 Descripción / Edición del programa fuente
P-6.9.2 Montaje eléctrico
P-6.9.3 Grabación del dispositivo y comprobaciones finales
P-6.9.4 Ahora tú

MATERIAL COMPLEMENTARIO
 Ejemplos y librerías de la Unidad 6
 Vídeos
o Ejemplos de la Unidad 6
 Soluciones Unidad 5
 Cuestionario

6-2
www.mkelectronica.com Microcontroladores PIC: Nivel I
AREA DE TEORÍA

T- 6.1 LOS DISPLAY DE 7 SEGMENTOS

Seguro que los has visto en infinidad de máquinas y aparatos de la más diversa índole. Son unos
dispositivos económicos y fáciles de manejar. Como periféricos de salida se emplean para visualizar todo
tipo de valores numéricos.

Los hay de diferentes tipos, colores y tamaños. Puedes encontrarte


con varios displays integrados en una única cápsula, y displays con
hasta 16 segmentos
capaces de visualizar todo
tipo de números, letras y
símbolos.

El laboratorio USB-
PIC’School dispone de dos
displays de 7 segmentos y un punto decimal. Mira la figura.

Básicamente un display de este tipo está compuesto de siete diodos leds con
forma de segmentos y distribuidos formando el clásico “ocho”. Otro led con forma
circular representa el punto decimal. A cada segmento se le identifica con una
letra como puedes ver en la figura. Empezamos desde el segmento “a”, en orden
alfabético y en sentido horario, hasta el segmento “g” y el punto decimal o “dp”.

6-3
www.mkelectronica.com Microcontroladores PIC: Nivel I
Internamente esos segmentos o leds están conectados entre sí mediante sus ánodos o mediante
sus cátodos. Se denominan displays de “ánodo común” o “cátodo común”. En la siguiente figura tienes los
esquemas elétricos internos para ambos casos.

En un display de ánodo común,


a
éste se conecta a una tensión a
a a
positiva (o nivel “1”). De esta
forma, para activar cada led o f
f b
b
b
segmento en particular, f

debemos aplicar una tensión f b


g
negativa (o nivel “0”) a su g
g g
cátodo correspondiente. e c
e c
c
e
En un display de cátodo común
e c
el funcionamiento es justo al d
d
contrario. El cátodo común se d d
dp dp
conecta a una tensión negativa
dp dp
(o nivel “0”) y cada segmento en
particular se activa aplicándole ANODO COMUN CATODO COMUN

una tensión positiva (o nivel “1”)


en su ánodo correspondiente.

Sea como fuere, según combinemos qué leds o segmentos se


activan o no, el display pude mostrar diferentes símbolos
numéricos. Por ejemplo, como se muestra en la figura, si deseas
visualizar el número 2, deberás activar los segmentos: a, b, d, e y
g. Si deseas visualizar el número 7 junto con el punto decimal
deberás activar los segmentos: a, b, c y dp.

En el laboratorio de prácticas USB-PIC’School dispones de dos displays de ánodo común. Fíjate en


el esquema eléctrico de la figura. Hay dos patillas, la 3 y la 8, que se corresponden con los ánodos comunes
del display. Se conectan directamente a la tensión positiva de alimentación, +5Vcc.

Los cátodos individuales de cada segmento se conectan a través de unas resistencias de absorción
con las ocho líneas de, por ejemplo, la puerta B. RB0 controla al segmento “a”, RB1 al “b”, RB2 al “c”, …
RB7 al punto decimal “dp”. Como es un display de ánodo común cada segmento se activa cuando se le
aplica un nivel lógico “0”. Según esto, la siguiente tabla muestra los códigos binarios que debes sacar por la
puerta B para visualizar cualquier dígito hexadecimal (del 0 al 9 y del A al F) manteniendo apagado el punto
decimal.
10 1 16
DIGITO PUERTA B DIGITO PUERTA B
a 9 RB0
b 7
2 15
RB1 0 11000000 (0xC0) 8 10000000 (0x80)
3 14
c 5 4 13
RB2 1 11111001 (0xF9) 9 10011000 (0x98)
d 4 RB3
e 2
5
6
12
11
RB4 2 10100100 (0xA4) A 10001000 (0x88)
f 1 RB5 3 10110000 (0xB0) B 10000011 (0x83)
7 10
g 6 RB6
8 9
dp RB7 4 10011001 (0x99) C 11000110 (0xC6)
330 5 10010010 (0x92) D 10100001 (0xA1)
6 10000010 (0x82) E 10000110 (0x86)
AC

AC

7 11111000 (0xF8) F 10001110 (0x8E)


8

+5 Vcc

6-4
www.mkelectronica.com Microcontroladores PIC: Nivel I
T-6.1.1 Multiplexado de los displays

Ya has visto que para controlar un display de 7 segmentos y un punto decimal, necesitas 8 líneas o
patillas de salida del controlador. ¿Y si deseas controlar dos displays? … necesitarás 16 patillas. Según
esto, si quieres controlar una pantalla de, por ejemplo 6 displays, necesitas 48 patillas de salida del
controlador (6 x 8). Con esta progresión no existe un controlador que tenga las puertas o patillas de E/S que
puedes llegar a necesitar.

Cuando se necesita controlar varias displays, se emplea una técnica conocida como “Multiplexado”
o “Barrido”. Todos los segmentos de todos los displays se conectan en paralelo. Es decir, todos los
segmentos “a” se conectan entre sí, lo mismo los segmentos “b”, “c”, “d”, etc…

Si esto es así, podría parecerte que cuando aplicas un código binario a los segmentos, al estar
estos conectados en paralelo, todos los displays visualizarán el mismo símbolo ¿no? Pues efectivamente sí,
y desde luego que NO es deseable. Observa el esquema eléctrico de la figura y que se corresponde a la
conexión de los dos displays del laboratorio.

DECENAS UNIDADES
a 1 16 10 10
1 b 2 15 9 a 9 a
2 c 3 14 7 b 7 b
3 d 4 13 5 c 5 c
4 e 5 12 4 d 4 d
5 f 6 11 2 e 2 e
6 g 7 10 1 f 1 f
7 dp 8 9 6 g 6 g
8 dp dp
330
DATOS
AC

AC

AC

AC
3

8
DECENAS
1
2 UNIDADES Q7 Q8
3 BC547 BC547
4

CONTROL

+5VCC

Los segmentos de ambos displays, unidades y decenas, están conectados entre sí y se controlan
desde el conector de DATOS al que irán a parar las patillas de salida del controlador (p.e. la Puerta B). Por
otra parte, los ánodos comunes de cada display van por separado, unidades y decenas, y se controlan
desde el conector de CONTROL al que irán a parar otras dos patillas de salida del controlador. En total
estamos consumiendo 10 líneas del controlador: 8 para los segmentos y 2 para los ánodos de cada display.

La técnica del multiplexado consiste en aplicar por el conector de DATOS el código binario para
activar los segmentos que se deseen, por ejemplo, en el display de las unidades. Al mismo tiempo por el
conector de CONTROL se activa el ánodo del display de las unidades Y SOLO DE ESE. En ese instante
estamos visualizando la información de las unidades.

A continuación se repite el proceso con el display de las decenas. Por el conector de DATOS se
aplica el código binario correspondiente a los segmentos que se desean activar, y por el de CONTROL se
activa ahora al display de las decenas Y SOLO A ESE. Estamos visualizando la información de las
decenas.

Ahora pensarás… bien, pero entonces veré que los displays se iluminan y visualizan información de
forma secuencial, primero en el de las unidades y luego en el de las decenas. Efectivamente. Sin embargo
imagina que ese proceso se repite de forma indefinida y a la máxima velocidad. ¿Qué verás? Que los dos
displays están iluminados al mismo tiempo y cada uno visualiza lo que le corresponde. Es una sensación
óptica. Se debe a que la retina de nuestros ojos no es capaz de percibir variaciones rápidas de luz.

6-5
www.mkelectronica.com Microcontroladores PIC: Nivel I
Es algo parecido a lo que ocurría en el ejemplo 5-5 de la unidad anterior, el que desplazaba a
izquierda o a derecha el encendido de un led. Si disminuías la temporización, aumentaba la velocidad. Llega
un momento en que el desplazamiento es tan rápido que veías a todos los leds iluminados ¿cierto?

La técnica del multiplexado ahorra patillas del controlador. Para gobernar dos displays te bastan 10
patillas y no 16. Para gobernar 6 displays te bastan 14 patillas y no 48. Es decir siempre necesitas 8 patillas
para controlar los 7 segmentos y el punto
decimal, y luego una patilla de más por cada
display que vayas a utilizar. Es un ahorro
importante ¿no te parece? En la figura tienes
un ejemplo de conexión de un controlador con
4 displays que en este caso son de cátodo
común. Emplea un total de 12 patillas de
salida.

Claro que también hay inconvenientes.


Tu programa se puede complicar. Piensa que
el multiplexado o barrido hay que hacerlo
constantemente cada cierto tiempo. Si dejas
de hacerlo los displays se apagarán. Si te
demoras demasiado entre un barrido y el
siguiente, tus ojos serán capaces de percibir
efectos molestos como parpadeos y cambios
en el brillo de los displays. Ya experimentarás
con todo esto en el área de prácticas.

T-6.1.2 Ahora tú

Seguramente te habrás dado cuenta de que un display de siete segmentos puede visualizar otros
símbolos aparte de los clásicos numéricos. A la vista del display de la figura, completa la siguiente tabla
indicando qué segmentos se deben activar para visualizar los símbolos propuestos. Recuerda que el
laboratorio dispone de displays de ánodo común.

Símbolo SEGMENTOS Valor


dp g f e d c b a en HEX.
t
º
n
h
H
ñ
r
q
y
P
u
U

6-6
www.mkelectronica.com Microcontroladores PIC: Nivel I
T-6.2 LA PANTALLA LCD

Se trata de un periférico de salida que permite


visualizar no sólo números, sino también todo tipo de
caracteres, textos, símbolos e incluso sencillos gráficos.
Seguro que también las has visto en infinidad de
aplicaciones. Las puedes encontrar con diferentes
números de líneas y caracteres por línea. También las
hay con luz de fondo y caracteres de diferentes colores
y tamaños.

Todas ellas llevan su propio controlador que


gestiona todas las operaciones internas. Normalmente
la mayoría son compatibles con el popular HD44780 de
Hitachi. Gracias a esto, es prácticamente lo mismo
utilizar una pantalla de 2 líneas por 16 caracteres (2 x
16) que otra que sea de 4 x 20.

El laboratorio USB-PIC’School dispone de una


pantalla LCD modelo LMB162AFC de la firma Topway
Technology Co. Ltd. ( www.topwaydisplay.com ). Se trata de
una pantalla de 2 x 16 retro iluminada con caracteres en
blanco sobre fondo azul. Es compatible con el controlador
Hitachi HD44780 que se comentaba anteriormente.

T-6.2.1 Conexiones

La pantalla LCD es un dispositivo digital. Sus señales se pueden conectar directamente con las
patillas de E/S del controlador. En la LCD
siguiente figura tienes el esquema de la
pantalla LCD tal y como está
implementada sobre el laboratorio de LCD HD44780 compatible
prácticas USB-PIC’School. En el conector
GND
VCC
VLC
RW
RS
D7
D6
D5
D4
D3
D2
D1
D0

DATOS dispones de hasta 8 señales de


L+
L-

datos con las que se transfiere información


16
15

14
13
12
11
10
9
8
7

6
5
4

3
2
1

hacia o desde la pantalla. Aquí conectarás 100n

las patillas de entrada/salida de tu


controlador (p.e. la Puerta B). En el
conector CONTROL están las señales que 1K
+5VCC
L7
L6
L5
L4
L3
L2
L1
L0

controlan el funcionamiento. Aquí también GND


conectarás otras tres patillas de salida de
E
RW
RS

tu PIC. En la tabla tienes una descripción +5VCC


8
7
6
5
4
3
2
1

4
3
2
1

de cada patilla. DATOS CONTROL

PATILLA NOMBRE TIPO DESCRIPCIÓN



1 Vss Alimentación Alimentación de tierra (0 V).
2 Vdd Alimentación Alimentación positiva de +5 Vcc.
3 V0 Alimentación Ajuste de contraste. Se le aplica una tensión variable entre 0
y +5 Vcc.

6-7
www.mkelectronica.com Microcontroladores PIC: Nivel I
4 RS Entrada Salida desde el PIC. Selección de instrucciones/datos:
RS=0 El PIC va a transferir instrucciones
RS=1 El PIC va a transferir datos (códigos ASCII)
5 R/W Entrada Salida desde el PIC. Control de lectura/escritura:
R/W=0 El PIC realiza una escritura sobre la pantalla LCD
R/W=1 El PIC realiza una lectura de la pantalla LCD
6 E Entrada Salida desde el PIC. Habilitación de la pantalla:
E=0 Pantalla LCD deshabilitada (en alta impedancia)
E=1 Pantalla LCD habilitada
7-14 DB0:DB7 E/S Bus de instrucciones/datos. El PIC transfiere a la pantalla
instrucciones o datos en función de la señal RS.
Con un interface de 8 bits se emplean las líneas DB0:DB7
Con un interface de 4 bits se emplean las líneas DB4:DB7
15 BLA Alimentación Tensión positiva para la luz de fondo (+5 Vcc).
16 BLK Alimentación Tensión negativa para la luz de fondo (0 V).

T-6.2.2 Características eléctricas

La pantalla es un periférico digital cuyas características eléctricas se resumen en la siguiente tabla:

DESCRIPCIÓN SÍMBOLO MIN. TIP. MAX. UNIDAD PATILLA


Tensión de alimentación VDD 4.7 5.0 5.3 V VDD
Tensión de entrada a “1” VIH 0.8xVDD ---- VDD V RS, R/W, E
Tensión de entrada a “0” VIL VSS ---- 0.5 V y DB0:DB7
Tensión de salida a “1” VOH 0.7xVDD ---- VDD V DB:DB7
Tensión de salida a “0” VOL VSS ---- 0.5 V
Consumo del LCD IDD ---- 1.3 3.0 mA VDD, VSS
Alimentación luz de fondo VfBLA ---- 5.0 ---- V BLA
Consumo luz de fondo IfBLA ---- ---- 70 mA BLA

En la siguiente figura tienes los diagramas de tiempos correspondientes a los ciclos de lectura y
escritura sobre la pantalla LCD. Tu controlador se debe basar en ellos para realizar cualquier operación con
la pantalla.

Según estos diagramas, para realizar un ciclo de escritura sobre la pantalla, debes generar las
señales indicadas y que se suponen conectadas con las patillas de tu PIC.

1. La patilla a la que has conectado la señal RS la pones a nivel “0” o a nivel “1” en función de si le vas
a transferir a la pantalla una instrucción o bien un dato respectivamente.
2. A continuación la patilla donde has conectado la señal R/W la pones a nivel “0” (Write=Escritura).

6-8
www.mkelectronica.com Microcontroladores PIC: Nivel I
3. Pones a nivel “1”, la patilla que controla la señal E. Con ello queda activada la pantalla.
4. Por las patillas configuradas como salidas, a las que has conectado las señales DB0-DB7, sacas la
información que deseas escribir. Esta puede ser un código de instrucción o bien un dato (código
ASCII), depende de cómo hayas puesto la patilla que gobierna la señal RS.
5. Pones a nivel “0” la patilla que controla la señal E. La pantalla queda ahora desactivada y el ciclo de
escritura finaliza.

Si lo que tu controlador va a realizar es un ciclo de lectura, la secuencia será la siguiente:

1. La patilla conectada a la señal RS la pones a “0” o a “1” en función de si vas a leer de la pantalla
LCD una instrucción o un dato (código ASCII) respectivamente.
2. La patilla conectada con la señal R/W la pones a nivel “1” (Read=Lectura).
3. Pones a nivel “1”, la patilla que controla la señal E. Con ello queda activada la pantalla.
4. Por las patillas configuradas ahora como entradas, a las que has conectado las señales DB0-DB7,
tienes la información que te ofrece la pantalla. Puede ser una instrucción o un dato en función de
cómo pusiste la señal RS. Realiza ahora la lectura de esas patillas.
5. Pones a nivel “0” la patilla que controla la señal E. La pantalla queda desactivada y el ciclo de
lectura finaliza.

El fabricante especifica los tiempos mínimos y máximos que deben tener esas señales.

DESCRIPCIÓN SÍMBOLO MIN. TIP. MAX. UNIDAD


Duración del ciclo E de acceso Tc 1500 ---- ---- nS
Tiempo a “1” del ciclo E de acceso Tpw 175 ---- ---- nS
Tiempo de subida del pulso E Tr ---- ---- 20 nS
Tiempo de bajada del pulso E Tf ---- ---- 20 nS
Tiempo de selección RS Tas 5 ---- ---- nS
Tiempo de mantenimiento de RS Tah 13 ---- ---- nS
Tiempo para la puesta de la instrucción/dato Tdsw 50 ---- ---- nS
Tiempo de salida del dato Tddr ---- ---- 125 nS
Tiempo de mantenimiento de la instrucción/dato Th 13 ---- ---- nS

T-6.2.3 Juego de instrucciones

Como ya se ha indicado la pantalla LCD tiene su propio controlador para gestionar las múltiples
tareas internas. Este admite un conjunto de instrucciones con las que puedes establecer una serie de
opciones de trabajo de la pantalla, así como conseguir diferentes efectos de visualización. Estas
instrucciones las introduce nuestro PIC a través de las patillas a las que hemos conectado las señales DB0-
DB7, y las patillas conectadas a las señales de control RS y R/W.

CLEAR DISPLAY

Borra la pantalla LCD y la RAM de datos (DD RAM), colocando el cursor en la primera posición de la
primera fila de la pantalla (dirección 0). Pone el bit I/D a "1" por defecto.

Código:
RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
0 0 0 0 0 0 0 0 0 1

HOME

Coloca el cursor en la posición de inicio de la pantalla, en la primera posición de la primera fila


(dirección 0), con lo que la visualización comienza a realizarse desde esta posición. El contenido de la
memoria RAM de datos de visualización (DD RAM) no se modifica (la visualización sobre la pantalla se
mantiene). La dirección de la memoria RAM de datos para la visualización (DD RAM) se inicia a 0.

6-9
www.mkelectronica.com Microcontroladores PIC: Nivel I
Código:
RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
0 0 0 0 0 0 0 0 1 X

ENTRY MODE SET

Establece la dirección de movimiento del cursor y también si la visualización se va desplazando a la


siguiente posición de la pantalla o no. Estas operaciones se ejecutan durante la lectura o escritura de la DD
RAM o CG RAM. Para visualización normal poner el bit S a "0".

Código:
RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
0 0 0 0 0 0 0 1 I/D S

DISPLAY ON/OFF CONTROL

Activa o desactiva poniendo en ON/OFF, tanto al display (D) como al cursor (C) y se establece si
este último debe o no parpadear (B).

Código:
RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
0 0 0 0 0 0 1 D C B

CURSOR OR DISPLAY SHIFT

Mueve el cursor y desplaza la visualización sin cambiar el contenido de la memoria de datos de


visualización DD RAM.

Código:
RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
0 0 0 0 0 1 S/C R/L X X

FUNCTION SET

Con el bit DL se establece el tipo de interface del bus de datos en 4 bits (DB4-DB7) u 8 bits (DB0-
DB7). También determina el número de líneas del display (N) y tipo de carácter (F).

Código:
RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
0 0 0 0 1 DL N F X X

SET THE CG RAM ADDRESS

El módulo LCD, además de tener definido todo el conjunto de caracteres ASCII estándar, permite al
usuario definir hasta 8 caracteres gráficos diferentes. La composición de estos caracteres se va guardando
en una memoria gráfica llamada CG RAM con capacidad para 64 bytes. Cada carácter gráfico definido por
el usuario se compone de 8 bytes que se almacenan en sucesivas posiciones de esta memoria CG RAM.

Con esta instrucción se establece la dirección de la memoria CG RAM a partir de la cual se van a ir
almacenando los bytes que definen un carácter gráfico. Ejecutado este comando todos los datos que se
escriban o se lean posteriormente, lo hacen sobre esta memoria CG RAM.

Código:
RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
0 0 0 1 Dirección de la CG RAM

6-10
www.mkelectronica.com Microcontroladores PIC: Nivel I
SET THE DD RAM ADDRESS

Los caracteres o datos que se visualizan en la pantalla, se van almacenando previamente en una
memoria de datos llamada DD RAM, para de aquí pasar a la pantalla. Mediante esta instrucción se
establece la dirección de memoria DD RAM a partir de la cual se irán almacenando los datos a visualizar.
Ejecutado este comando, todos los datos que se escriban o lean posteriormente proceden de esta memoria
DD RAM. En nuestra pantalla de 2x16, las direcciones de la 0x80h a la 0x8Fh se corresponden con los 16
caracteres de la primera línea y de la 0xC0h a la 0xCFh con los 16 caracteres de la segunda línea.

Código:
RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
0 0 1 Dirección de la DD RAM

READ BUSY FLAG & ADDRESS

Cuando el módulo LCD está realizando cualquiera de las instrucciones anteriores, se consume un
cierto tiempo de ejecución en el que no se le debe mandar ninguna otra. Para ello, dispone de un flag
llamado BUSY (BF), que indica que el módulo está ocupado. Esta instrucción de lectura informa del estado
de dicho flag además de proporcionar el valor del contador de direcciones de la CG RAM o de la DD RAM,
según la última que se haya empleado.

Código:
RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
0 1 BF Dirección de la CG RAM o de la DD RAM

WRITE DATA TO GG OR DD RAM

Permite escribir en la memoria DD RAM los datos que se quieren presentar en pantalla, y que
corresponden a los diferentes códigos ASCII de los caracteres a visualizar. Igualmente también es posible
escribir en la memoria CG RAM los diferentes bytes que permiten confeccionar caracteres gráficos a gusto
del usuario. Observa que la señal RS está ahora a nivel “1”. El hecho de escribir en uno u otro tipo de
memoria, depende de si se ha empleado previamente la instrucción de direccionamiento DD RAM (SET
THE DD RAM ADDRESS) o la de direccionamiento CG RAM (SET THE CG RAM ADDRESS).

Código:
RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
1 0 Código ASCII o byte del carácter gráfico

READ DATA FROM CG OR DD RAM

También podemos leer, desde la memoria DD RAM, los datos que están almacenados y que se
corresponden con los códigos ASCII de los caracteres que se están visualizando actualmante. Igualmente
se puede leer, de la memoria CG RAM, los diferentes bytes con los que se ha confeccionado un
determinado carácter gráfico. El leer de uno u otro tipo de memoria depende de si se ha empleado
previamente la instrucción de direccionamiento de la DD RAM o la de direccionamiento CG RAM. Observa
que ahora la señal R/WS se debe poner a nivel “1”.

Código:
RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
1 1 Código ASCII o byte del carácter gráfico

6-11
www.mkelectronica.com Microcontroladores PIC: Nivel I
CAMPOS USADOS EN LAS INSTRUCCIONES

Se listan a continuación los campos o leyendas que se han empleado en algunos de los códigos de
instrucción anteriores y su significado:

CAMPO NIVEL DESCRIPCIÓN


S 1 Desplaza la visualización cada vez que se escribe un nuevo
carácter
0 Modo normal de visualización
I/D 1 Incrementa el cursor en una unidad
0 Decrementa el cursor en una unidad
S/C 1 Desplaza el display
0 Desplaza el cursor
R/L 1 Desplazamiento a la derecha
0 Desplazamiento a la izquierda
BF 1 Módulo LCD ocupado
0 Módulo LCD disponible
DL 1 Interface con un bus de 8 líneas o bits (DB0:DB7)
0 Interface con un bus de 4 líneas o bits (DB4:DB7)
N 1 Pantalla LCD de dos o más líneas
0 Pantalla LCD de una línea
F 1 Tamaño del carácter de 5 x 11 pixels
0 Tamaño del carácter de 5 x 8 pixels
B 1 Parpadeo del cursor On
0 Parpadeo del cursor Off
C 1 Cursor On (visible)
0 Cursor Off (no visible)
D 1 Pantalla LCD On
0 Pantalla LCD Off

T-6.2.4 Juego de caracteres

En la figura siguiente tienes una muestra del juego de caracteres que admite la pantalla LCD, y que
están establecidos por el fabricante. Una memoria ROM interna contiene la definición de cada uno de ellos.
Este juego de caracteres puede variar entre diferentes modelos o versiones de las pantallas.

A la izquierda, en las filas, se representan los 4 bits de menos peso del carácter (B3:B0). En la parte
superior de la tabla, en las columnas, se representan en binario los 4 bits de más peso del carácter (B7:B4).
Para codificar un carácter cualquier basta con seleccionarlo y localizar en qué columna/fila se encuentra.
Por ejemplo el carácter ‘F’ se encuentra en la columna 4 (0100) y en la fila 6 (0110). Su código binario es
por tanto 0100 0110 (0x46) que se corresponde exactamente con el código ASCII del carácter ‘F’.

Se comentaba anteriormente que no todas las pantallas tienen porqué tener el mismo juego de
caracteres. Efectivamente, esto depende del fabricante, modelo, versión, etc. Lo que sí es común en todas,
son los códigos correspondientes a los caracteres ASCII estándar. Éstos se corresponden con los
caracteres de las columnas 2 (0010) a la 7 (0111).

6-12
www.mkelectronica.com Microcontroladores PIC: Nivel I
T-6.2.5 Los caracteres gráficos

Puedes definir un total de hasta 8 caracteres gráficos de 5x8 o 4 caracteres de 5x10 pixels. Para
visualizar posteriormente cualquiera de ellos, lo seleccionas enviando a la DDRAM un valor o dato
comprendido entre 0 y 7.

Los caracteres gráficos se definen introduciendo en sucesivas posiciones de la memoria CGRAM


del módulo LCD, unos bytes cuyos patrones binarios definen el carácter. La CGRAM consiste en una

6-13
www.mkelectronica.com Microcontroladores PIC: Nivel I
memoria volátil capaz de almacenar un total de 64 bytes. Un carácter de 5x8 puntos necesita 8 de esos
bytes para ser definido. Caben por tanto 8 caracteres creados por el usuario (8 x 8). Un carácter de 5x10
necesita sin embargo de un total de 16 bytes (los 6 últimos no se usan). Se admiten por tanto un total de 4
caracteres de este tipo (16 x 4).

En la figura se definen dos caracteres de 5x8 (en azul) que se introducen en las 16 primeras
posiciones de la CGRAM. El primero en las posiciones 0 a 7 y el segundo en las posiciones 8 a 16. Cada bit
de cada uno de esos bytes que valga nivel “1”, implica que su correspondiente punto o pixel en el LCD se
active. El primer carácter gráfico de la CGRAM se visualiza enviando el código 0x00 a la DDRAM como si
de un código ASCII se tratara. El segundo carácter se visualiza enviando el código 0x01 y así
sucesivamente.

T-6.2.6 La librería “LCD4bitsPIC16.inc”

En la Unidad 5 anterior ya usaste por vez primera una librería, la librería “MSE_Delay.inc”. Contenía
una subrutina o función, “Delay”, que te permitía realizar fácilmente temporizaciones desde 1 hasta 2000
mS con una precisión bastante aceptable.

De manera similar, en el material complementario de esta unidad, dispones de la librería,


“LCD4bitsPIC16.inc”, que contiene una serie de funciones o rutinas que te facilitarán enormemente el
empleo de la pantalla LCD. Realmente una librería es un fichero que contiene una o varias subrutinas. Lo
puedes abrir y editar para que ver y estudiar su contenido. Te animo a que así lo hagas. En la tabla tienes el
resumen de las cuatro subrutinas contenidas en esta librería.

En programación es muy frecuente que algunas subrutinas necesiten parámetros de entrada para
su correcta ejecución. Finalizada esta quizá también pueden ofrecer como resultado ciertos parámetros de
salida. Observa la tabla.

6-14
www.mkelectronica.com Microcontroladores PIC: Nivel I
NOMBRE ENTRADA SALIDA DESCRIPCIÓN
UP_LCD Ninguno Ninguno Configura las líneas de E/S
conectadas a la pantalla LCD
LCD_INI Ninguno Ninguno Rutina para la inicialización de la
pantalla LCD según las
especificaciones del fabricante
LCD_DATO W=Contiene el Ninguno Envía a la pantalla el dato a
carácter a visualizar visualizar en la posición actual
del cursor
LCD_REG W=Contiene el código Ninguno Envía a la pantalla la instrucción
de la instrucción a que debe ejecutar
ejecutar por parte de
la pantalla LCD

T-2.6.7 Ahora tú

Completa la siguiente tabla para definir los caracteres gráficos propuestos. Indica el valor binario y
hexadecimal que hay que guardar en cada posición de la memoria CGRAM, las direcciones de esta y el
código del carácter que tendrías que usar cuando vayas a usar visualizar cualquiera de ellos.

CARACTER Bits en la memoria CGRAM Valor Dirección Código del


7 6 5 4 3 2 1 0 en Hex. en CGRAM carácter
0 0 0 0x00
0 0 0
0 0 0
0 0 0
0 0 0 0x00
0 0 0
0 0 0
0 0 0
0 0 0 0x10
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0 0x18
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0 0x30
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0

6-15
www.mkelectronica.com Microcontroladores PIC: Nivel I
T-6.3 EL TECLADO

Se trata del periférico de entrada por excelencia. Seguro que también los has visto y usado en
infinidad de ocasiones como son el teclado de tu ordenador, el de una máquina de juegos, de un
electrodoméstico, de tu móvil, etc… Los hay de diferentes tipos: de teclas, de membrana, táctiles, etc…
También los hay de diferentes tamaños y usos como son los teclados numéricos, alfanuméricos,
musicales…

En primer lugar has de saber que un teclado no es ni más ni menos que un conjunto de pulsadores.
Cuando accionas uno de ellos cierras un circuito eléctrico que introduce un nivel lógico (“0” o “1”) por la
patilla de entrada del controlador a la que está conectado. ¿Tienes algún problema en detectar si un
pulsador está activado o no? En el área de prácticas de la Unidad 5 anterior ya hiciste algún ejemplo que
consistía en detectar si un pulsador (o interruptor) estaba o no accionado.

En la figura tienes un pequeño teclado compuesto de cuatro


teclas o pulsadores conectados con otras tantas patillas de entrada del
controlador. Mediante las instrucciones “btfss” o “btfsc” que ya
conoces, no debieras tener problema alguno para detectar sin
cualquiera de esas teclas está accionada (nivel “0”) o no lo está (nivel
“1”).

El problema empieza cuando nuestro teclado es de muchas


teclas. Si tuviéramos que gestionar un teclado de 16 teclas, conectadas
como en la figura necesitaríamos 16 patillas de entrada. Vale, ¿y si el
teclado fuera de 103 teclas o más, como los de un PC? Seguramente
nuestro controlador no tendría patillas suficientes.

Por este motivo es muy frecuente que las múltiples teclas (o pulsadores) se configuren de forma
matricial. Es decir las teclas se organizan en filas y columnas. En la siguiente figura se muestra el esquema
eléctrico de un teclado de 16 teclas organizado en una matriz de 4 filas y 4 columnas (4 x 4). El PIC
necesitará 8 patillas para su control total. Por ejemplo, un teclado de 100 teclas se puede organizar en una
matriz de 10 x 10 y sólo harían falta 20 patillas del controlador.

El número de filas y columnas en las que se disponen las teclas no tiene porqué ser el mismo, pero
sí bastante parecido. Es decir, el teclado de 100 teclas se podría organizar en una matriz de 4 x 25, pero se
necesitarían 29 patillas del controlador para su gestión. ¿Lo entiendes?

6-16
www.mkelectronica.com Microcontroladores PIC: Nivel I
T-6.3.1 Exploración del teclado C0 C1 C2 C3

Según esta disposición


matricial de las teclas ¿cómo 1 2 3 A
averiguar cuál de ellas se ha pulsado?
Se emplea una técnica conocida como F0

“exploración” o “barrido” del teclado. 4 5 6 B


F1
Imagina que las 4 columnas
C0:C3 se conectan a 4 patillas de 7 8 9 C
salida del controlador y que las 4 filas
F2
F0:F3 se conectan con otras 4 patillas
pero de entrada. * 0 # D
F3

La exploración empieza poniendo a nivel “0”, por ejemplo, la columna C0. Inmediatamente se leen
las 4 entradas, las filas F0:F3. Si una de esas filas está a nivel “0”, es porque una de las 4 teclas asociadas
a la columna C0 (1, 4, 7 y *) está pulsada. Por ejemplo, si al poner a “0” la columna C0, se lee que la fila F2
también está a “0”, es porque la tecla 7 está pulsada.

Si no se detecta ninguna fila a nivel “0” es porque ninguna tecla de la columna C0 está pulsada. Se
pasa a explorar la siguiente columna, la C1, poniéndola a “0” y repitiendo el proceso. Se leen nuevamente
las filas y, si una de ellas está a “0”, es porque alguna de las teclas de la columna C1 (2, 5, 8 y 0) está
pulsada.

Si no se detecta ninguna fila a nivel “0” cuando se pone a “0” la columna C1, es porque ninguna de
sus teclas está pulsada. Se pasa a poner a “0” la columna C2 y se repite el proceso. Si ninguna tecla de la
columna C2 (3, 6, 9 y #) está pulsada, se pasa a la columna C3. En este caso se explorarán las teclas A, B,
C y D.

En resumidas cuentas, una exploración consiste en ir activando secuencialmente cada columna al


mismo tiempo que se leen las filas. Si alguna de estas filas está activada, es porque la tecla que se
encuentra en la intersección Columna/Fila está accionada. La exploración finaliza y se devuelve el código
de la tecla pulsada. Si al explorar todas las columnas no se detecta ninguna fila activada, significa que en
ese instante no se ha pulsado ninguna tecla. Normalmente se devuelve un determinado código para
identificar esta situación.

Unos detalles. Se habla de un nivel “0” para activar una columna o detectar si hay alguna fila
activada. Se podría emplear el nivel “1”. También se habla de activar secuencialmente las columnas y leer
las filas. Puede ser al revés, activar secuencialmente las filas y leer las columnas. Es lo mismo.

Mira las siguientes figuras. Corresponden al teclado del laboratorio USB-PIC’School y a las
conexiones con las patillas de la puerta B que vamos a realizar.

8
RB7 F3
RB6
7
6 F2 1 2 3 ^
RB5 F1
5
RB4 F0
4 4 5 6
^
RB3 C3
3
RB2 C2
2
RB1 C1
RB0
1
C0 7 8 9 >

* 0 # <

TECLADO4X4

6-17
www.mkelectronica.com Microcontroladores PIC: Nivel I
En la siguiente tabla se han dispuesto los diferentes códigos binarios que se obtienen en función de
la tecla que se pulse y basándose en las conexiones eléctricas de los esquemas anteriores. Estos códigos
reciben el nombre de “códigos de exploración” y dependen de cómo y dónde estén conectadas
eléctricamente cada tecla. Es decir, a la tecla que se encuentra en la intersección de la Columna C0 con la
Fila F0, le corresponde un código. Dicho código no tiene porqué tener relación alguna con el símbolo o
carácter que está pintado en la tecla. Esa relación entre código de exploración y carácter asociado, se
realiza posteriormente.

Hay un código de exploración único para cada tecla y debes entender que se forma como
consecuencia de activar una columna y leer una fila activa: “Si se activa la columna Cn y se lee que la fila
Fn está activa, es porque la tecla pulsada es …”

TECLA FILAS COLUMNAS Código


Pulsada F3(RB7) F2(RB6) F1(RB5) F0(RB4) C3(RB3) C2(RB2 C1(RB1) C0(RB0) HEX.
1 1 1 1 0 1 1 1 0 0xEE
4 1 1 0 1 1 1 1 0 0xDE
7 1 0 1 1 1 1 1 0 0xBE
* 0 1 1 1 1 1 1 0 0x7E
2 1 1 1 0 1 1 0 1 0xED
5 1 1 0 1 1 1 0 1 0xDD
8 1 0 1 1 1 1 0 1 0xBD
0 0 1 1 1 1 1 0 1 0x7D
3 1 1 1 0 1 0 1 1 0xEB
6 1 1 0 1 1 0 1 1 0xDB
9 1 0 1 1 1 0 1 1 0xBB
# 0 1 1 1 1 0 1 1 0x7B
A (^) 1 1 1 0 0 1 1 1 0xE7
B (v) 1 1 0 1 0 1 1 1 0xD7
C (>) 1 0 1 1 0 1 1 1 0xB7
D (<) 0 1 1 1 0 1 1 1 0x77

Ya ves que la conexión matricial de los pulsadores de un teclado te permite ahorrar un buen número
de patillas del controlador. Sin embargo, al igual que pasaba con los displays de 7 segmentos, tus
programas se pueden complicar. Te debes preocupar de realizar una exploración periódica cada cierto
tiempo. Si no lo hicieras así, podría ocurrir que se pulse una tecla y tu programa no se “entere”.

Vamos a hacer unos sencillos cálculos. Supón que eres la persona más rápida del mundo, capaz de
teclear 1000 pulsaciones por minuto. Esto equivale aproximadamente a 16,6 pulsaciones por segundo o, lo
que es igual, a una pulsación cada 60 mS o 60.000
µS. Este sería el tiempo mínimo entre una
exploración del teclado y la siguiente.

Para un PIC trabajando a 4MHz y


ejecutando una instrucción cada 1 µS, esto no
debiera ser un gran problema. El controlador hará
una exploración, luego tiene un intervalo de tiempo
de unos 60000 µS para dedicarse a realizar otras
tareas, antes de volver a explorar el teclado. Ahora
bien, si el PIC se demora en hacer la siguiente
exploración y sobrepasa ese tiempo, podría ocurrir
que un tipo rápido como tú pulse una tecla justo
entonces y el PIC no la detecte.

6-18
www.mkelectronica.com Microcontroladores PIC: Nivel I
T-6.3.2 La librería “Teclado.inc”

De la misma forma que dispones de una librería para el manejo de la pantalla LCD, también
dispones de la librería “Teclado.inc” para el control del teclado. Te recuerdo que una librería está
compuesta de un conjunto de funciones o subrutinas. La puedes editar para analizar su contenido y, si
procede, también la puedes modificar y adaptarla a tus necesidades.

La librería “Teclado.inc” está formada por una única subrutina: “Key_Scan”. Cada vez que haces
uso de ella te devuelve, en la variable “Tecla”, el código BCD de la tecla pulsada. Si no se detecta ninguna
pulsación devuelve el código 0x80.

NOMBRE ENTRADA SALIDA DESCRIPCIÓN


Tecla=Código BCD de la Realiza un barrido del teclado y detecta si
tecla pulsada. hay alguna tecla pulsada. La variable
Key_Scan ninguna Tecla=0x80 si no se pulsa "Tecla" se carga con el código de la tecla
ninguna pulsada o con 0x80 en caso de no haber
ninguna

Si estudias un poco su funcionamiento, verás que realiza una exploración del teclado en los mismos
términos que se explicó anteriormente: activa las columnas y lee las filas empleando el nivel lógico “0” como
nivel activo. Se obtiene así el código de exploración de la tecla pulsada a partir del cual obtiene
posteriormente el código BCD de la misma, como hubiera podido ser el código ASCII o cualquier otro.

TECLA Valor BCD en “Tecla” TECLA Valor BCD en “Tecla”


0 00000000 (0x00) 8 00001000 (0x08)
1 00000001 (0x01) 9 00001001 (0x09)
2 00000010 (0x02) A (^) 00001010 (0x0A)
3 00000011 (0x03) B (v) 00001011 (0x0B)
4 00000100 (0x04) C (>) 00001100 (0x0C)
5 00000101 (0x05) D (<) 00001101 (0x0D)
6 00000110 (0x06) * 00001110 (0x0E)
7 00000111 (0x07) # 00001111 (0x0F)
ninguna 10000000 (0x80) ninguna 10000000 (0x80)

T-6.3.3 Ahora tú

C0 (RB2) C1 (RB1) C2 (RB0)

En la figura tienes el esquema de un


1 2 3 teclado de 12 teclas con una
F0 (RB3)
configuración matricial de 3 x 4. Se trata
de un teclado numérico como puede ser
4 5 6
el de un teléfono. Suponiendo que sus
F1 (RB4) columnas C0:C2 y sus filas F0:F3 están
7 8 9 conectadas a las patillas de la puerta B
del PIC tal y como se indica, se trata de
F2 (RB5) completar la siguiente tabla con los
* 0 # códigos de exploración de cada tecla. Se
supone que los niveles activos son los
F3 (RB6) niveles “0”.

6-19
www.mkelectronica.com Microcontroladores PIC: Nivel I
TECLA FILAS COLUMNAS Código
Pulsada F3(RB6) F2(RB5) F1(RB4) F0(RB3) C0(RB2) C1(RB1) C2(RB0) HEX.
1
2
3
4
5
6
7
8
9
*
0
#

6-20
www.mkelectronica.com Microcontroladores PIC: Nivel I
AREA DE PRTÁCTICAS

Es el momento de comenzar a experimentar con los periféricos digitales estudiados en el área de


teoría. Para ello te voy a proponer una serie de programas de ejemplo. Como ya se ha indicado en varias
ocasiones, estos programas son puramente didácticos. Se han diseñado de la forma más sencilla posible,
evitando emplear técnicas de programación más complejas, elegantes y seguro que también más efectivas.
Te animo pues a que los mejores en todos los aspectos.

Por no repetir todos los pasos que se llevan a cabo en el desarrollo de cualquier proyecto, y que ya
has utilizado en las anteriores Unidades 4 y 5, te los resumo ahora para no ser demasiado reiterativo en lo
sucesivo:

1. Descripción / Edición del programa fuente.


2. Creación del proyecto y ensamblado. Configuración el entorno de trabajo.
3. Montaje eléctrico.
4. Ejecución y depuración del programa usando las técnicas de ejecución paso a paso, con
breakpoints y en tiempo real.
5. Grabación final del dispositivo.
6. Comprobaciones finales.
7. Si se tercia y apetece, diseño y montaje de un circuito mínimo, económico y a medida para cada
proyecto.

P-6.1 EJEMPLO 6-1: Control de un display

El laboratorio USB-PIC’School dispone de dos displays de ánodo común. Esto quiere decir que los 8
leds (segmentos) están conectados internamente por el ánodo que lo debes conectar a +5 Vcc. Dispones de
los cátodos para activar o no a cada segmento en particular. Les debes aplicar una tensión negativa
respecto al ánodo, es decir, un nivel lógico “0”.

En este ejemplo se visualiza el dígito 0 o el dígito 1 según el valor binario del interruptor E0,
conectado con la entrada RA0. Mediante el interruptor E1 conectado con la entrada RA1 se activa o no el
punto decimal (dp).

P-6.1.1 Descripción/Edición del programa fuente

Este conjunto de instrucciones se chequea el estado del interruptor E0 conectado a la línea de


entrada RA0. No es una gran novedad. Si está a “0”, por la puerta B conectada a los segmentos del display,
se saca el valor binario b’11000000’. Esto implica que se activarán todos los segmentos excepto el punto
decimal (“dp”) y el segmento “g”. Se visualiza por tanto el dígito 0. Si está a “1” se activan únicamente los
segmentos “b” y “c” del display. Se visualiza el dígito 1.

Loop btfsc PORTA,0 ;Chequea RA0


goto RA0_es_1 ;Es nivel "1"
movlw b'11000000'
movwf PORTB ;Visualiza el dígito 0 mediante su
;correspondiente código de 7 segmentos
goto Test_RA1
RA0_es_1 movlw b'11111001'
movwf PORTB ;Visualiza el dígito 1 mediante su
;correspondiente código de 7 segmentos

Este otro conjunto de instrucciones comprueba el estado del interruptor E1 conectado con la entrada
RA1. Si está a “1” se activa el punto decimal (“dp”) y si está a “0” se desactiva. Tampoco es una novedad.

6-21
www.mkelectronica.com Microcontroladores PIC: Nivel I
Test_RA1 btfsc PORTA,1 ;Chequea RA1
goto RA1_es_1 ;Está a "1"
bsf PORTB,7 ;Desconecta punto decimal
goto Loop
RA1_es_1: bcf PORTB,7 ;Activa punto decimal
goto Loop

P-6.1.2 Proyecto y Ensamblado

Como siempre, mediante Project  Wizard, crea el proyecto y con el comando Project  Make
(F10) lo ensamblas para obtener el correspondiente fichero ejecutable. Abres las ventanas que te interesen
y salva el proyecto mediante Project  Save Project o lo cierras mediante Project  Close.

P-6.1.3 Montaje eléctrico

El esquema se muestra en la
7 SEGMENTOS E0 RA0
figura. El ánodo común del display de
RB0 E1 RA1
las unidades, el de la derecha, se a
b RB1
conecta con +5 Vcc de alimentación. c
d
RB2
RB3
E2

Los interruptores E0 y E1 con las e RB4 E3


f RB5
entradas RA0 y RA1 respectivamente. g RB6 E4
dp RB7
Por último las 8 salidas RB0:RB7 de la E5
puerta B se conectan con los segmentos AC DEC AC UNI
.

E6
“a” al “g” y el “dp” del display. E7
+5 Vcc
E. DIGITALES

P-6.1.4 Ejecución/depuración

Pon el conmutador del laboratorio en la posición USB y conéctalo con el puerto USB del PC. A
continuación selecciona en el MPLAB-IDE la herramienta de depuración mediante Debugger  Select
Tool  PICkit2. Con el botón Program the target device transfiere al PIC el programa que acabas de
ensamblar y que vas a depurar y/o ejecutar. También es interesante que pulses el botón Reset para
asegurar el inicio de la ejecución desde el principio.

¡Importante! Recuerda que en el modo de depuración, cuando el conmutador se encuentra en la


posición USB, las líneas RB6 y RB7 quedan desconectadas de los periféricos (en este caso de los
segmentos g y dp). Las emplea el propio sistema de depuración para la transferencia de información
entre el PIC y el MPLAB-IDE. Observarás que no funcionan según tu programa. Es normal.

P-6.1.5 Grabación del dispositivo y comprobaciones finales

Para grabar, primero deshabilita el depurador mediante Debugger  Select Tool  None y luego
habilita el grabador mediante Programmer  Select Programmer  PICkit 2.

¡No te olvides de hacer el proceso inverso cuando necesites nuevamente del depurador!

Mediante el botón Program the target device grabas el programa en la memoria flash del
controlador.

6-22
www.mkelectronica.com Microcontroladores PIC: Nivel I
Coloca el conmutador del laboratorio en la posición central
RUN. De esta forma el PIC queda aislado del sistema de
grabación y/o depuración. Comprueba que el programa
funciona correctamente según las especificaciones, tal y
como se muestra en la figura.

Observa que ahora los segmentos “g” y “dp” funcionan


según lo previsto. En la posición RUN del conmutador, las
líneas RB7 y RB6 se desconectan del sistema de
depuración/grabación y se conectan con los periféricos, en
este caso esos dos segmentos del display.

P-6.1.6 Ahora tú

¿Un display de siete segmentos sólo visualiza números? No, también puede visualizar algunos
símbolos y letras. Todo depende de los segmentos que decidas activar. Por ejemplo, para visualizar la letra
“A” basta con que actives a todos los segmentos excepto el “d”.

Modifica el programa para que, cuando el interruptor E0 conectado con la línea RA0 esté a nivel “0”,
se visualice la letra “L” (Low), y cuando esté a nivel “1” visualice la letra “H” (High).

P-6.2 EJEMPLO 6-2: Decodificador BCD a 7 segmentos


RA3:RA0 DIGITO RA3:RA0 DIGITO
Aquí tienes un auténtico ejemplo con evidente utilidad 0000 0 1000 8
práctica. Se trata de realizar el clásico decodificador BCD a 7 0001 1 1001 9
segmentos tan empleado en electrónica digital. Mediante los 0010 2 1010 A
cuatro interruptores E3:E0 conectados a las líneas RA3:RA0 0011 3 1011 B
de la puerta A de entrada, introducimos un código binario de 4 0100 4 1100 C
bits. Los segmentos “a” al ”g” conectados con las salidas 0101 5 1101 D
RB0:RB7 de la puerta B se activarán mostrando el dígito 0110 6 1110 E
0111 7 1111 F
correspondiente según la siguiente tabla.

P-6.2.1 Descripción / Edición del programa fuente

Este ejemplo sí que aporta una novedad al programa. Consiste en una tabla con datos constantes
que se almacenarán en la memoria flash de forma no volátil. La tabla contiene los códigos binarios que hay
que aplicar al display de 7 segmentos, para visualizar cualquier número hexadecimal del 0 al F. También
emplea una instrucción que hasta el momento no has usado, la “retlw”. Retorna desde una subrutina con un
valor cargado en el registro W. Esta técnica es muy utilizada en programación y con este ejemplo tienes una
muy buena referencia.

Tabla: addwf PCL,F ;Desplazamiento sobre la tabla


retlw b'11000000' ;Dígito 0
retlw b'11111001' ;Dígito 1
retlw b'10100100' ;Dígito 2
retlw b'10110000' ;Dígito 3
retlw b'10011001' ;Dígito 4
retlw b'10010010' ;Dígito 5
retlw b'10000010' ;Dígito 6
retlw b'11111000' ;Dígito 7
retlw b'10000000' ;Dígito 8
retlw b'10011000' ;Dígito 9

6-23
www.mkelectronica.com Microcontroladores PIC: Nivel I
retlw b'10001000' ;Dígito A
retlw b'10000011' ;Dígito B
retlw b'11000110' ;Dígito C
retlw b'10100001' ;Dígito D
retlw b'10000110' ;Dígito E
retlw b'10001110' ;Dígito F

En algún momento nuestro programa principal llama a la subrutina mediante la instrucción “call
Tabla”. El registro W debe estar cargado con un valor que actúa como valor de desplazamiento sobre esa
tabla. En este ejemplo ese valor se corresponde con el código BCD del dígito a visualizar.

Por ejemplo, el registro W está cargado con el valor 4 (00000100) y se ejecuta la instrucción “call
Tabla”. La primera instrucción de esta subrutina es “addwf PCL,F” que suma al valor actual del PC, el valor
de W (4). El PC en ese momento está apuntando a la primera instrucción “retlw b’11000000’”. Si se le suma
4 el PC apuntará ahora a la instrucción “retlw b’10011001’”. Cuando se ejecuta esta instrucción el sistema
retorna al programa principal al tiempo que el registro W se carga con ese valor, el b’10011001’, que
“casualmente” se corresponde con el código 7-segmentos que visualizará el número 4.

En otras palabras, el registro W se carga con un número BCD de 4 bits y, tras la subrutina, retorna
con el código 7-segmentos correspondiente a ese número.

Por su parte, el cuerpo principal del programa es muy sencillo:

Loop movf PORTA,W


andlw b'00001111' ;Lee el código de RA0-RA3
call Tabla ;Convierte a 7 segmentos
movwf PORTB ;Visualiza sobre el display
goto Loop

Desde la puerta A de entrada, se carga en W el valor binario procedente de los interruptores


RA3:RA0. Con este valor se salta a la subrutina mediante “call Tabla” y se retorna con el código de 7-
segmentos del número equivalente. Este código se deposita en la puerta B de salida donde están
conectados los segmentos del display. El bucle se repite de forma indefinida.

Procura estudiar bien este ejemplo ya que esta técnica será muy utilizada en múltiples aplicaciones
y proyectos posteriores.

P-6.2.2 Montaje eléctrico

7 SEGMENTOS E0 RA0
Se muestra en la figura. El
RB0 E1 RA1
ánodo común del display de las a
b RB1
unidades, el de la derecha, se conecta c
d
RB2
RB3
E2 RA2

con +5 Vcc de alimentación. Los e RB4 E3 RA3


f RB5
interruptores E0:E4 con las entradas g RB6 E4
dp RB7
RA0:RA4 respectivamente. Por último E5
las 8 salidas RB0:RB7 de la puerta B se AC DEC AC UNI
.

E6
conectan con los segmentos del E7
display. +5 Vcc
E. DIGITALES

P-6.2.3 Ejecución / Depuración

Suponemos que has ensamblado el programa y creado el nuevo proyecto. Ahora pones el
conmutador del laboratorio en la posición USB y lo conectas con el puerto USB del PC. A continuación
selecciona en el MPLAB-IDE la herramienta de depuración mediante Debugger  Select Tool  PICkit2.
Con el botón Program the target device transfiere al PIC el programa que acabas de ensamblar y que vas

6-24
www.mkelectronica.com Microcontroladores PIC: Nivel I
a depurar y/o ejecutar. También es interesante que pulses el botón Reset para asegurar el inicio de la
ejecución desde el principio.

Sería muy interesante que, dada su importancia, te apliques con este ejemplo. Te recomiendo hacer
una ejecución paso a paso que te permita analizar con todo lujo de detalles cómo se comporta el
controlador durante el salto a la subrutina “Tabla”. No pierdas de vista en ningún momento a los registros
PCL y W.

¡Importante! Hay que recordar que en el modo de depuración, cuando el conmutador se encuentra
en la posición USB, las líneas RB6 y RB7 quedan desconectadas de los periféricos (en este caso de
los segmentos g y dp). Las emplea el propio sistema de depuración para la transferencia de
información entre el PIC y el MPLAB-IDE. Observarás que no funcionan según tu programa. Es
normal.

P-6.2.4 Grabación del dispositivo y comprobaciones finales

Para grabar, primero deshabilita el depurador mediante Debugger  Select Tool  None y luego
habilita el grabador mediante Programmer  Select Programmer  PICkit 2. Con el botón Program the
target device graba el programa en la memoria flash del controlador.

Ahora coloca el conmutador del laboratorio en la posición central RUN. De esta forma el PIC queda
aislado del sistema de grabación y/o depuración. Comprueba que el programa funciona correctamente
según las especificaciones. Mediante los interruptores vas aplicando una a una las posibles combinaciones
binarias de 4 bits, desde 0000 hasta 1111, según la tabla del enunciado anterior.

Observa que ahora, los segmentos “g” y “dp”, los conectados con las patillas PB6 y RB7, funcionan
según lo previsto. En la posición RUN del conmutador, las líneas RB7 y RB6 se desconectan del sistema de
depuración/grabación y se conectan con los periféricos, en este caso esos dos segmentos del display.

P-6.2.5 Ahora tú

En primer lugar te sugiero que emplees el display de las decenas, el de la izquierda. Así tendrás la
oportunidad de comprobar su correcto funcionamiento. Para ello basta que cambies el cable que va desde
la tensión de +5 Vcc al ánodo común del display de las unidades, y lo conectes con el ánodo del de las
decenas.

También puedes probar a alimentar a los ánodos de ambos displays al mismo tiempo. Como están
en paralelo, los dos displays visualizarán exactamente lo mismo. De momento no los estás multiplexado
como se explicó en el área de teoría. Quizá notes que brillan menos. Es normal, has duplicado el consumo
de corriente que proporcionan las patillas de la puerta B a los segmentos.

Por último plantéate el diseño de un decodificador más ambicioso. Por ejemplo, si añades el
pulsador E4 y lo conectas con la línea RA4 de la puerta A, podrás generar códigos binarios de 5 bits. Esto te
5
permite producir un total de 32 combinaciones diferentes (2 ). En el display se pueden visualizar no sólo los
16 números del ejemplo (del 0 al F), también puedes visualizar otros tantos símbolos y/o letras. ¿Te
atreves? Pues ánimo.

P-6.3 EJEMPLO 6-3: Multiplexado de los displays

Con este ejemplo se resume todo lo relativo al control de los displays de 7 segmentos. En el
laboratorio USB-PIC’School tienes 2 displays de ánodo común en paralelo. Para su control vas a emplear lo
que se conoce como la técnica del “barrido” o “multiplexado”. En un momento dado se activa el ánodo del
display de las unidades y por la puerta B de salida se indica qué segmentos se deben iluminar para

6-25
www.mkelectronica.com Microcontroladores PIC: Nivel I
visualizar en el dígito de las unidades. A continuación se activa el ánodo del display de las decenas y se
indica qué segmentos se deben iluminar para visualizar en el dígito de las decenas.

Es decir, secuencialmente se va activando a cada display al tiempo que se le indica qué segmentos
debe iluminar. En un mismo instante de tiempo sólo hay un único display activado. El proceso se repite a
una determinada velocidad que nos provoca la sensación óptica de que todos los displays están iluminados,
y cada uno con el dígito que le corresponde. Son cosas de nuestra retina como ya hemos experimentado en
algún ejemplo anterior. En éste se trata de visualizar sobre los displays la constante “Valor” (p.e. 0x35). Se
puede visualizar cualquier otra constante o el valor de cualquier otra variable.

P-6.3.1 Descripción/Edición del programa fuente

Vamos a echar un vistazo a la rutina “Visu_Disp” que se muestra a continuación y que es la sección
más novedosa del ejemplo. Se trata de la rutina que realiza un barrido de los dos displays del laboratorio.

Visu_Disp movwf Visu_Temp ;Salva el valor a visualizar


andlw b'00001111'
call Tabla ;Convierte a 7 segmentos el valor de las unidades
movwf PORTB ;Salida a los segmentos
bsf PORTA,2 ;Activa el display de las unidades
Delay 1 Milis ;Temporiza 1mS (MODIFICABLE !!)
bcf PORTA,2 ;Desactiva display de las unidades
movlw b'11111111'
movwf PORTB ;Apaga los segmentos
swapf Visu_Temp,W
andlw b'00001111'
call Tabla ;Convierte a 7 segmentos el valor de las decenas
movwf PORTB ;Salida a los segmentos
bsf PORTA,3 ;Activa display de las decenas
Delay 1 Milis ;Temporiza 1 mS (MODIFICABLE !!)
bcf PORTA,3 ;Desactiva display de las decenas
movlw b'11111111'
movwf PORTB ;Apaga los segmentos
return

El registro W contiene los dos dígitos a visualizar. En primer lugar se coge el dígito de las unidades
(los cuatro bits de menos peso). Mediante la ya conocida rutina “Tabla” se convierte a 7 segmentos y se
saca por la puerta B. En este instante se activa el ánodo del display de las unidades y sólo el de las
unidades. Éste muestra su correspondiente dígito durante 1 mS y seguidamente se desconecta. Los
segmentos se apagan.

A continuación se coge el dígito de las decenas (los cuatro bits de más peso), se convierte a 7
segmentos (subrutina “Tabla”) y se saca nuevamente por la misma puerta B. Ahora se activa el ánodo del
display de las decenas, que muestra su correspondiente dígito durante 1 mS para, seguidamente,
desconectarse. Los segmentos se vuelven a apagar.

El cuerpo del programa principal es tan sencillo como esto:

Loop movlw Valor ;Carga el valor a visualizar


call Visu_Disp ;Visualiza sobre los displays
Delay 1 Milis ;Temporización entre un barrido y el siguiente
goto Loop

6-26
www.mkelectronica.com Microcontroladores PIC: Nivel I
El registro W se carga con los dos dígitos a visualizar que pueden proceder de una constante o de
una variable. Se llama a la subrutina “Visu_Disp” de visualización, que a su vez hace uso de la subrutina
“Tabla”. Tras una temporización de 1 mS, el bucle se vuelve a repetir de forma indefinida.

P-6.3.2 Montaje eléctrico 7 SEGMENTOS

a RB0
b RB1
Se muestra en la figura. El ánodo común del display c RB2
d RB3
de las unidades, el de la derecha, se controla desde la salida e RB4
RB5
RA2, el de las decenas se controla desde RA3. f
g RB6
dp RB7

Las salidas RB0:RB7 de la puerta B se conectan con AC DEC AC UNI

.
los segmentos a:g y dp. Éstos son comunes para ambos
displays ya que están en paralelo. RA2
RA3
P-6.3.3 Ejecución / Depuración

Una vez ensamblado el programa y libre de errores, pon el conmutador del laboratorio en la
posición USB y selecciona en el MPLAB-IDE la herramienta de depuración mediante Debugger  Select
Tool  PICkit2. Con el botón Program the target device transfiere al PIC el programa que acabas de
ensamblar y que vas a depurar y/o ejecutar. También es interesante que pulses el botón Reset para
asegurar el inicio de la ejecución desde el principio.

¡Importante! Hay que recordar que en el modo de depuración, cuando el conmutador se encuentra
en la posición USB, las líneas RB6 y RB7 quedan desconectadas de los periféricos (en este caso de
los segmentos g y dp). Las emplea el propio sistema de depuración para la transferencia de
información entre el PIC y el MPLAB-IDE. Observarás que no funcionan según tu programa. Es
normal.

P-6.3.4 Grabación del dispositivo y comprobaciones finales

Para grabar, primero deshabilita el depurador


mediante Debugger  Select Tool  None y
luego habilita el grabador mediante Programmer
 Select Programmer  PICkit 2.

¡No te olvides de hacer el proceso inverso


cuando necesites nuevamente del depurador!

Mediante el botón Program the target device


graba el programa en la memoria flash del
controlador.

Coloca el conmutador del laboratorio en la


posición central RUN. De esta forma el PIC queda
aislado del sistema de grabación y/o depuración.
Comprueba que el programa funciona
correctamente según las especificaciones. Los
displays deben visualizar la constante 35 tal y
como se muestra en la figura.

Observa que ahora los segmentos “g” y “dp” funcionan según lo previsto. En la posición RUN del
conmutador, las líneas RB7 y RB6 se desconectan del sistema de depuración/grabación y se conectan con
los periféricos, en este caso esos dos segmentos del display.

6-27
www.mkelectronica.com Microcontroladores PIC: Nivel I
P-6.3.5 Ahora tú

La modificación más sencilla que puedes hacer con este ejemplo sería cambiar el valor de la
constante a visualizar. También puedes hacer que en lugar de una constante, se visualice el valor de una
variable con el resultado de una operación aritmético/lógica.

Sin embargo te propongo un trabajo más bien experimental pero de gran valor didáctico. Consiste
en variar el valor de las temporizaciones.

1. Varía el valor de las dos temporizaciones que se producen en la subrutina “Visu_Disp” según la
siguiente tabla, y comenta tus apreciaciones. Al final vuelve a dejar estas temporizaciones a su valor
original de 1 mS.

TEMPORIZACIÓN DESCRIPCIÓN

Delay 20 Milis

Delay 50 Milis

Delay 100 Milis

Delay 500 Milis

2. Ahora varía el valor de la temporización que hay dentro del bucle principal del programa según la
tabla. Para cada caso describe lo que creas conveniente e indica qué valor de temporización
consideras como máximo entre un barrido y el siguiente manteniendo una cierta calidad de
visualización. Al final lo dejas con su valor original de 1 mS.

TEMPORIZACIÓN DESCRIPCIÓN

Delay 10 Milis

Delay 20 Milis

Delay 40 Milis

Delay 100 Milis

P-6.4 EJEMPLO 6-4: Década contadora Up/Down

Otro ejemplo con evidente utilidad práctica. Se propone el diseño de un contador UP/DOWN
(ascendente/descendente) de 2 dígitos capaz de contar desde 00 hasta 99. Los pulsos a contar se aplican
por la entrada RA0 a la que conectarás el pulsador E4. Con el interruptor E0 conectado a la entrada RA1, se
selecciona si la cuenta es ascendente (UP) o descendente (DOWN).

P-6.4.1 Descripción/Edición del programa fuente

El ejemplo utiliza la misma rutina “Visu_Disp” para realizar el barrido sobre los dos displays del
laboratorio USB-PIC’School. Visualizaba el contenido actual del registro W.

6-28
www.mkelectronica.com Microcontroladores PIC: Nivel I
El cuerpo principal del programa espera a detectar un pulso completo (transición 1-0-1) por la línea
RA0 y procedente del pulsador E4 del laboratorio. Observa que, mientras se espera un flanco del pulso a
contar, se ejecuta la rutina “Visu_Disp” para que los displays no dejen nunca de iluminarse o refrescarse.

Recibido el pulso completo, se chequea el estado del interruptor E0 conectado en RA1. Si está a “0”
se procede al decremento del contador. Si está a “1” se incrementa. Echa un vistazo a cómo se realiza tanto
el incremento como el decremento del contador. Seguro que se podrá hacer de otra manera incluso más
optimizada.

El contador tiene que ser un contador decimal que evoluciona hacia arriba o hacia abajo pero
siempre en el rango de 00 a 99. El contador se divide en dos partes, la baja (“Contador_L”) y la alta
(“Contador_H”). Cuando haya que incrementar el contador, se incrementa la parte baja. Si ésta alcanza el
valor 10 (0x0A), se pone a cero y se incrementa la parte alta. Si ésta también alcanza el valor de 10 (0x0A),
se pone a 0.

Si hay que decrementar el contador, primero se decrementa la parte baja. Si ésta alcanza el valor
0xFF, se pone a 9 y se decrementa la parte alta. Si ésta también alcanza el valor 0xFF se carga con 9.
Finalmente ambas partes del contador se fusionan en una única variable “Contador” que será visualizada en
los displays.

P-6.4.2 Montaje eléctrico

7 SEGMENTOS Lo tienes en la figura. Los dos


RB0
E0 RA1 displays se conectan de la misma
a
b RB1 E1 manera que en el ejemplo anterior.
c RB2
d RB3 E2
e RB4
f RB5 E3
El pulsador E4 se conecta con la
g RB6
dp RB7 RA0
entrada RA0. Por ella se aplican los
E4
pulsos a contar. El interruptor E0 se
AC DEC AC UNI E5
conecta con la entrada RA1 y se
.

E6
emplea para seleccionar si la cuenta
RA2 E7 será ascendente o descendente.
RA3
E. DIGITALES

P-6.4.3 Grabación del dispositivo y comprobaciones finales

Se supone que ya has creado el proyecto y ensamblado el programa. También has depurado y
puesto a punto el programa con las herramientas y técnicas que ya conoces y has usado. No volveremos a
repetirlo. Ahora toca grabar el controlador. Deshabilita el depurador mediante Debugger  Select Tool 
None y luego habilita el grabador mediante Programmer  Select Programmer  PICkit 2.

¡No te olvides de hacer el proceso inverso cuando necesites nuevamente del depurador!

Mediante el botón Program the target device grabas el programa en la memoria flash del
controlador.

Colocar el conmutador del laboratorio en la posición central RUN. De esta forma el PIC queda
aislado del sistema de grabación y/o depuración. Comprueba que el programa funciona correctamente
según las especificaciones. El contador parte de 00. Con cada pulso que apliques con el pulsador E4, el
contador se incrementa o decrementa en función del estado del interruptor E0. En cualquier caso el
contador siempre evoluciona en el rango de 00 a 99.

6-29
www.mkelectronica.com Microcontroladores PIC: Nivel I
P-6.4.4 Ahora tú

Propongo un trabajo puramente experimental. Averigua qué ocurre si eliminas del programa fuente
las llamadas a las macros “Delay 5 Milis”. Para ello basta con que pongas “;” delante de dicha macro, con lo
que será considerada como un simple comentario.

Anota tus impresiones: ___________________________________________________________________

_____________________________________________________________________________________

_____________________________________________________________________________________

Posteriormente también puedes modificar el tiempo de esas macros para elevar la temporización a
unos 1000 mS (“Delay 1000 Milis”).

Anota tus impresiones: __________________________________________________________________

____________________________________________________________________________________

____________________________________________________________________________________

Cualquiera de los proyectos que estás viendo los puedes llevar hasta los últimos términos. Esto es,
diseñar una tarjeta electrónica mínima, económica y de reducidas dimensiones, que contiene el PIC recién
grabado con el programa de la aplicación, así como los periféricos necesarios conectados con él. En la
Unidad 5 anterior ya se te propuso algo parecido.

Mira la figura. En esta ocasión se ha empleado la tarjeta PIC’Control. Se trata de una tarjeta
comercial de propósito general. Contiene al propio microcontrolador al que has grabado el programa y su
circuitería asociada: Alimentación, RESET, Oscilador general, etc… PIC’Control se conecta con otra tarjeta,
la PIC’Project. Sobre ella se montan los periféricos en cuestión. En este caso los dos displays que visualizan
la cuenta, el pulsador para introducir los pulsos a contar y la tecla con la que se selecciona si la cuenta es
ascendente (Up) o descendente (Down).

6-30
www.mkelectronica.com Microcontroladores PIC: Nivel I
P-6.5 EJEMPLO 6-5: La pantalla LCD

Con este ejemplo vas a tener tu primera toma de contacto con la pantalla LCD. Este potente
periférico te permite visualizar cualquier tipo de información alfabética compuesta de números, letras y
símbolos, por lo que es mucho más flexible (y caro) que los displays de 7 segmentos que has usado
anteriormente. Por otra parte, como se ha mostrado en el área de teoría, una pantalla LCD se controla
mediante unas sencillas patillas de E/S digitales, como el resto de periféricos que has usado hasta el
momento.

Este primer ejemplo consiste sencillamente en visualizar la palabra “Hola” sobre la pantalla.

P-6.5.1 Descripción/Edición del programa fuente

La única novedad de este ejemplo es la librería “LCD4bitsPIC16.INC” que incluirás en el programa


fuente mediante la directiva “Include”.

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

La librería contiene cuatro subrutinas o funciones que ya se han comentado pero que recordamos
nuevamente:

NOMBRE ENTRADA SALIDA DESCRIPCIÓN


UP_LCD Ninguno Ninguno Configura las líneas de E/S
conectadas a la pantalla LCD
LCD_INI Ninguno Ninguno Rutina para la inicialización de la
pantalla LCD según las
especificaciones del fabricante
LCD_DATO W=Contiene el Ninguno Envía a la pantalla el dato a
carácter a visualizar visualizar en la posición actual
del cursor
LCD_REG W=Contiene el código Ninguno Envía a la pantalla la instrucción
de la instrucción a que debe ejecutar
ejecutar por parte de
la pantalla LCD

Para poder hacer uso de esas rutinas es necesario hacer una reserva de posiciones de memoria
RAM empleadas por ellas mismas. El inicio de dicha reserva queda establecido mediante la directiva
siguiente:

Lcd_var equ 0x70 ;Variables (3) empleadas por las rutinas de manejo del LCD

El cuerpo principal del programa es muy sencillo. Una vez inicializada la pantalla, se limita a
transmitir, mediante las subrutinas “LCD_REG” y “LCD_DATO” de la librería, las instrucciones y caracteres
que se desean visualizar.

call UP_LCD ;Configura puertos para LCD


call LCD_INI ;Secuencia de inicio del LCD
movlw b'00001111'
call LCD_REG ;Envía instrucción: LCD ON, Cursor ON y blink ON
movlw 'H'
call LCD_DATO ;Visualiza H
movlw 'o'
call LCD_DATO ;Visualiza o
….
….

6-31
www.mkelectronica.com Microcontroladores PIC: Nivel I
Las dos primeras instrucciones, “call UP_LCD” y “call LCD_INI”, llaman a las correspondientes
subrutinas de la librería, para configurar las patillas de E/S conectadas con la pantalla e inicializar la pantalla
LCD respectivamente.

Las dos siguientes envían a la pantalla LCD la instrucción b‘00001111’. Con ella se activa la
pantalla, el cursor y el parpadeo de éste (consulta las instrucciones de la pantalla LCD en el apartado T-
6.2.3). Las sucesivas instrucciones se limitan a enviar a la pantalla los códigos ASCII de los caracteres que
deseas visualizar. Ya sabes que el ensamblador permite expresar valores en hexadecimal (0xHH), en
decimal (.DDD), en binario (b’bbbbbbbb’) y también en ASCII (‘A’).

P-6.5.2 Montaje eléctrico


PANTALLA LCD
Se muestra en la figura. La transferencia de instrucciones y datos
entre la pantalla y el PIC se realiza mediante un interface de 4 bits y para
2X16
ello empleamos las líneas RB0:RB3 de la puerta B.
R/W
RS

D0
D1
D2
D3
D4
D5
D6
D7
E

Con las líneas RA1:RA3 se gobiernan las señales de control:


10
11
12
13
14
4
5
6

7
8
9

RB3
RB2  Enable para habilitar o no a la pantalla LCD.
RB1
RB0
 R/W para indicar si vamos a leer o escribir sobre ella.
 RS para indicar si vamos a escribir una instrucción o un dato (un
RA1
RA2 carácter ASCII).
RA3

P-6.5.3 Grabación del dispositivo y comprobaciones finales

Ya no eres ningún novato así que no nos


vamos a repetir. Se da por hecho que has
ensamblado el programa fuente y creado el
proyecto con su entorno de trabajo. También lo
has depurado mediante las herramientas y
técnicas que conoces (ejecución paso a paso, con
breakpoints, en tiempo real, etc…).

Una vez funcionando el programa, has


terminado grabándolo en la memoria Flash del
controlador. Ahora haces las comprobaciones
finales. Coloca el conmutador del laboratorio en la
posición central RUN y comprueba que el
programa funciona correctamente según las
especificaciones. En la pantalla LCD aparecerá el
saludo “Hola” como se muestra en la figura.

P-6.5.4 Ahora tú

Lo más obvio que puedes hacer con este ejemplo es cambiar el mensaje de salida. Intenta
visualizar tu nombre sobre la pantalla.

P-6.6 EJEMPLO 6-6: Visualizando mensajes

El ejemplo te facilita aún más el uso de la pantalla LCD. Trata de visualizar una serie de mensajes
que se encuentran en la memoria flash de programa. Esta técnica te permitirá visualizar sobre el LCD
mensajes formados por cadenas de caracteres que se almacenan en la memoria de programa de forma
constante y no volátil.

6-32
www.mkelectronica.com Microcontroladores PIC: Nivel I
P-6.6.1 Descripción/Edición del programa fuente

Observa cómo se define cada tabla o cadena con los caracteres a visualizar. Empleamos la
instrucción “retlw” capaz de retornar de una subrutina con un valor en el registro W. Dicho valor será
precisamente el carácter a visualizar. Fíjate en la estructura de la siguiente tabla:

Tabla_Mensajes movwf PCL ;Calcula el desplazamiento sobre la tabla


Mens_0 equ $ ;Mens_0 apunta al primer carácter del mensaje 0
retlw 'H'
retlw 'o'
retlw 'l'
retlw 'a'
retlw 0x00 ;Último carácter del mensaje 0

El registro W se supone cargado con un valor que se corresponde con la dirección en la tabla del
carácter a visualizar. Cuando se llama a la subrutina “Tabla_Mensajes”, dicho valor se almacena en PCL, lo
que origina un desplazamiento sobre la tabla e implica la ejecución de la correspondiente instrucción “retlw”
de retorno. En otras palabras, el registro W contiene una dirección de la tabla, y retorna con un carácter.
Esta técnica es muy similar a la empleada en la decodificación de 7 segmentos empleada con los displays
de los ejemplos anteriores. Cada cadena emplea un último carácter, el 0x00, para indicar el final de la
misma.

La expresión “Mens_0 equ $” asigna a la etiqueta Mens_0 el valor que tiene el PC en se momento
(la dirección donde se encuentra el carácter ‘H’).

A continuación vamos a analizar la subrutina “Mensaje” que hemos creado. Es capaz de leer la
cadena completa de un mensaje al tiempo que, sobre la pantalla LCD, va visualizando los caracteres que la
compone. Esta subrutina parte de que en el registro W se indica la dirección del primer carácter de la
cadena o tabla a visualizar.

Dicha dirección se emplea para acudir a la subrutina “Tabla_Mensajes” y extraer el carácter que se
visualizará. La dirección se va incrementando hasta extraer el carácter 0x00. Es el último de la cadena y con
él finaliza la ejecución de la subrutina “Mensaje” y por tanto la visualización.

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 Mensaje_2
return
Mensaje_2 call LCD_DATO ;Visualiza en el LCD
incf Temporal_1,F ;Siguiente carácter
goto Mensaje_1

Para visualizar cualquier cadena de las definidas, basta con que en el programa principal se
ejecuten estas instrucciones:

movlw Mens_0 ;Carga el inicio del mensaje 0


call Mensaje ;Visualiza el mensaje 0

La instrucción “movlw Mens_0” carga en el registro W la dirección de inicio de la cadena “Mens_0”


(“Hola”). Mediante “call Mensaje” se visualiza la misma sobre la pantalla LCD.

6-33
www.mkelectronica.com Microcontroladores PIC: Nivel I
El programa se limita a visualizar de forma indefinida los mensajes “Hola” y “Adios”. Entre uno y otro
mensaje se intercala una temporización de 1000 mS (1 segundo). También se intercalan las instrucciones
“movlw b’00000001’” y “call LCD_REG”. Con ellas se ejecuta la instrucción b’00000001’ del LCD. Se trata
de una instrucción que origina su borrado y que coloca el cursor en la 1ª posición de la 1ª línea (consulta el
apartado T-6.2.3).

P-6.6.2 Montaje eléctrico

Se emplea el mismo esquema eléctrico que en el ejemplo anterior ejemplo.

P-6.6.3 Grabación del dispositivo y comprobaciones finales

Se da por hecho que has ensamblado el programa fuente y creado el proyecto con su entorno de
trabajo. Aunque el programa fuente tal y como se entrega en el material complementario funciona
correctamente, te recomiendo que hagas una exhaustiva depuración de este ejemplo. Más que nada para
que experimentes con la ejecución paso a paso y con las subrutinas. Si lo haces despacio, centrado y con
paciencia comprenderás al 100% el funcionamiento del programa, pero eso ya depende de ti…

En el ejemplo hay dos subrutinas anidadas: la subrutina “Mensaje” que a su vez llama a la subrutina
“Tabla_Mensajes”. Acuérdate de utilizar los botones “Step Over” y “Step Out” si no te quieres eternizar
cada vez que entres en cualquiera de ellas. Se trata de que cojas agilidad y destreza en la depuración y
puesta a punto de un programa. Cuentas con las herramientas necesarias para ello.

Cuando ya hayas trabajado y experimentado con la depuración, selecciona el modo grabador y


grabas el PIC con el programa definitivo. Coloca el conmutador del laboratorio en la posición central RUN y
comprueba que el programa funciona correctamente. En la pantalla LCD aparecerá, en alternancia, las
palabras “Hola” y “Adios”.

P-6.6.4 Ahora tú

Este ejemplo se puede modificar y mejorar añadiendo instrucciones propias de la pantalla LCD.
Consulta el apartado T-6.2.3. Sugiero que emplees las instrucciones necesarias para colocar el cursor en
cualquier lugar de la pantalla al objeto de centrar los mensajes sobre ella (por ejemplo tu nombre y apellido).
Experimenta también con otras instrucciones como hacer visible o no el cursor, que éste parpadee, etc…

P-6.7 EJEMPLO 6-7: Visualizando más mensajes

Para finalizar con el empleo de una pantalla LCD para la visualización de mensajes, se propone
este ejemplo en el que se visualizan varios.

P-6.7.1 Descripción/Edición del programa fuente

Lo más novedoso es la forma de definir las cadenas con los caracteres a visualizar. Se emplea la
siguiente estructura:

Mens_0 equ $ ;Mens_0 apunta al primer carácter del mensaje 0


dt "Curso on line:",0x00

Con la directiva “equ $” aseguramos que la etiqueta “Mens_0” se cargue con la dirección de inicio
del mensaje. Éste se define mediante la directiva “dt”. Esta directiva equivale a escribir tantas instrucciones
“retlw”, como caracteres tenga la cadena a visualizar, tal y como lo venías haciendo en los anteriores
ejemplos. Hay que reconocer que este método hace que el programa fuente sea más legible y cómodo de
escribir. Será el ensamblador el encargado de generar las instrucciones “retlw” correspondientes, pero lo
hace él, y no nosotros.

6-34
www.mkelectronica.com Microcontroladores PIC: Nivel I
Por lo demás, el resto del programa es muy similar. Se emplea la misma subrutina “Mensaje” para
visualizar cualquiera de las cadenas definidas mediante “dt”.

Presta atención a las instrucciones que se envían a la pantalla LCD para la colocación del cursor.

P-6.7.2 Montaje eléctrico

Se emplea el mismo esquema eléctrico que en los ejemplos anteriores.

P-6.7.3 Grabación del dispositivo y comprobaciones finales

Cuando ya hayas trabajado y experimentado con la depuración, selecciona el modo grabador y


graba el PIC con el programa definitivo. Coloca el conmutador del laboratorio en la posición central RUN y
comprueba que el programa funciona correctamente. En la pantalla LCD aparecerán los distintos mensajes.

P-6.8 EJEMPLO 6-8: El teclado

Vas a trabajar con otro periférico con nombre propio como es el teclado matricial. Se trata de un
periférico de entrada muy utilizado en cualquier aplicación o proyecto, y se emplea para introducir todo tipo
de datos. En el laboratorio USB-PIC’School dispones de un teclado matricial de membrana de 4x4 con el
que vas a experimentar. En el área de teoría ya se ha explicado la técnica que permite explorar un teclado.

La subrutina encargada de realizar el barrido devuelve el código de la tecla pulsada (p.e. un código
BCD o un código ASCII). Si durante un barrido no se detecta ninguna pulsación se devuelve otro código
diferente.

En este ejemplo, cada vez que se detecta una tecla pulsada, se visualiza el código BCD de esa
tecla sobre los leds S0:S3, conectados a las líneas RB0:RB3 de la puerta B.

P-6.8.1 Descripción/Edición del programa fuente

Lo más novedoso es la inclusión del fichero "Teclado.inc" que contiene la rutina “Key_Scan” de
barrido o exploración del teclado 4 x 4 del laboratorio:

NOMBRE ENTRADA SALIDA DESCRIPCIÓN


Tecla=Código BCD de la Realiza un barrido del teclado y detecta si
Key_Scan ninguna tecla pulsada. hay alguna tecla pulsada. La variable
Tecla=0x80 si no se pulsa "Tecla" se carga con el código de la tecla
ninguna pulsada o con 0x80 en caso de no haber
ninguna

include "Teclado.inc" ;Incluye rutinas de manejo del teclado

En el programa fuente se debe hacer una reserva de memoria RAM de datos para las variables
empleadas por la rutina contenida en “Teclado.inc” y cuyo inicio se establece así:

Key_var equ 0x73 ;Inicio de las 6 variables empleadas por las rutinas de manejo del
;teclado

El cuerpo principal del programa es sencillo:

6-35
www.mkelectronica.com Microcontroladores PIC: Nivel I
Loop 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 los leds de la Puerta B
Delay 2000 Milis ;Temporiza 2 seg.
clrf PORTB ;Desactiva visualización
goto Loop

Mediante “call Key-Scan” se realiza una exploración del teclado. Si devuelve 0x80 es porque no
hay ninguna tecla pulsada. El ciclo se repite hasta que la subrutina devuelva un código distinto a 0x80. Ese
código se corresponde con el código BCD de la tecla pulsada y se visualiza, durante dos segundos, sobre
los leds S0:S3 conectadas a las líneas RB0:RB3 de la puerta B.

P-6.8.2 Montaje eléctrico

El esquema eléctrico se muestra en la figura. Las columnas C0:C3 del teclado se conectan con las
patillas RB0:RB3 de la puerta B que se configuran como salidas. A esas líneas también se conectan los leds
S0:S3. Por su parte las filas F0:F3 del teclado se conectan con las patillas RB4:RB7 de la puerta B. Se
configuran como entradas con resistencia pull-Up interna.

RB7
8
F3
Estas señales en reposo estarán por
RB6
7
6 F2 1 2 3 ^ tanto a nivel “1”. Supongamos que por
RB5 F1
5
RB4 F0 la salida RB2 (columna C2) se saca un
4 4 5 6
^
RB3 C3
RB2
3
2 C2 nivel “0” al tiempo que se lee que la
RB1 C1
RB0
1
C0 7 8 9 > patilla de entrada RB5 (fila F1),
también está a “0” (el resto a “1”). La
* 0 # < intersección entre C2 y F1 identifica a
la tecla 6.
TECLADO4X4
S7

S6

S5

S4

S3

S2

S1

S0

SALIDAS DIGITALES

P-6.8.3 Grabación del dispositivo y comprobaciones finales

Cuando ya hayas trabajado y experimentado con la depuración, selecciona el modo grabador y


graba el PIC con el programa definitivo.

Colocar el conmutador del laboratorio en la posición central RUN. Comprueba que el programa
funciona correctamente según las especificaciones. Sin pulsar ninguna tecla, se puede apreciar que los leds
S0-S3 se iluminan con una cierta intensidad. Esto es porque en cada exploración del display se están
activando secuencialmente todas las salidas de las columnas. Cuando se pulsa una tecla cualquiera, el
barrido queda interrumpido y los leds S0:S3 visualizan durante un intervalo de 2 segundos, el código BCD
correspondiente a la tecla pulsada.

P-6.8.4 Ahora tú

Te propongo un trabajo de tipo experimental. Consiste en añadir, mediante la macro “Delay xxxx
Milis”, una temporización. Colócala justo después de la instrucción “Call Key_Scan”. Vas a realizar por tanto
una temporización entre una exploración y la siguiente. Completa la siguiente tabla indicando qué es lo que
percibes.

6-36
www.mkelectronica.com Microcontroladores PIC: Nivel I
TEMPORIZACIÓN ¿QUÉ PERCIBES?

Delay 100 Milis

Delay 500 Milis

Delay 1000 Milis

Delay 1500 Milis

Conforme vas aumentando el delay, percibirás que el teclado pierde “sensibilidad”. Parece que hay
que estar más tiempo pulsando la tecla para que ésta se detecte y visualice.

Se trata de buscar un valor de compromiso que no repercuta en la detección de nuestras


pulsaciones. Cuanto mayor sea ese valor, significa que más tiempo tendría el controlador para hacer sus
propios trabajos entre una exploración del teclado y la siguiente.

P-6.9 EJEMPLO 6-9: El teclado y la pantalla LCD

Con este último ejemplo de la Unidad 6 vas a realizar un completo interface de usuario formado por
la pantalla LCD y el teclado matricial de 4 x 4 del laboratorio USB-PIC’School. A partir de ahora puedes
incluir estos potentes periféricos en el diseño de tus futuras aplicaciones y proyectos.

En este caso, haciendo uso de todo lo que has aprendido hasta ahora, simplemente visualizarás
sobre la pantalla LCD el carácter correspondiente a la tecla que pulses.

P-6.9.1 Descripción/Edición del programa fuente

No hay mucho que describir. Vas a emplear todas las subrutinas que ya has usado en ejemplos
anteriores. Lo único destacable es la conversión a ASCII del código BCD de la tecla pulsada.

Cuando se pulsa una tecla, la rutina “Key_Scan” devuelve un código BCD. Este código es de 0000 a
1001 para las teclas del 0 al 9 y de 1010 a 1111 para el resto de teclas (A a F). El programa convierte los
códigos del 0 (0000) al 9 (1001) en sus correspondientes caracteres ASCII (‘0’= 00110000 al ‘9’=00111001).
Basta con sumar el valor 0x30. Los códigos 1010 al 1111 se convierten en los caracteres ‘A’ =01000001 a
‘F’=01000110. Para ello basta con sumar el valor 0x37.

P-6.9.2 Montaje eléctrico


PANTALLA LCD

Se muestra en la figura. Tanto el teclado como


la pantalla LCD se conectan como se ha 2X16
venido haciendo en los anteriores ejemplos.
R/W
RS

D0
D1
D2
D3
D4
D5
D6
D7

8
E

F3
7
F2 1 2 3 ^
La misma puerta B se emplea, en un instante
4
5
6

7
8
9
10
11
12
13
14

6
5 F1
para gobernar la pantalla LCD y, en otro, el 4 F0
C3 4 5 6
^
3
barrido del teclado. Estás consumiendo 2 C2
C1
únicamente 11 patillas del controlador. 1
C0 7 8 9 >

* 0 # <

TECLADO4X4
RB0
RA3
RA2
RA1

RB1
RB2
RB3
RB4
RB5
RB6
RB7

6-37
www.mkelectronica.com Microcontroladores PIC: Nivel I
Las líneas RA1:RA3 de la puerta B se emplean como señales de control de flujo de la pantalla LCD.

P-6.9.3 Grabación del dispositivo y comprobaciones finales

Colocar el conmutador del laboratorio en la posición


central RUN. Comprueba que el programa funciona
correctamente según las especificaciones. En la
pantalla LCD, tras un mensaje inicial, se visualiza el
carácter correspondiente a la tecla pulsada. Ver la
figura.

P-6.9.4 Trabajo personal

Con los conocimientos que tienes a estas alturas y los ejemplos realizados, puedes hacer
prácticamente los que se te ocurra. Es cuestión de imaginación. Te doy unas ideas para que practiques con
el empleo del teclado y del LCD:

 Calculadora para realizar sencillas operaciones de suma y resta.


 Control de accesos. Una salida que simula una apertura se activa cuando se aplique una
determinada clave de entrada.
 Un programa para activar/desactivar las salidas indicadas mediante el teclado, haciendo, mediante
mensajes, un interface humano adecuado.

En todos los ejemplos vistos en este tema hemos usado exclusivamente las líneas de las puertas A
y B. No debes olvidar que también dispones de otras 8 líneas de E/S procedentes de la puerta C, y otra más
de la puerta E.

6-38
www.mkelectronica.com Microcontroladores PIC: Nivel I
UNIDAD 7: CIRCUITOS AUXILIARES

OBJETIVOS

Todos los controladores tienen puertas de E/S con los que gobernar infinidad de periféricos digitales
como ya has hecho en las unidades anteriores. Además, los controladores actuales, disponen de una serie
de circuitos y dispositivos auxiliares o accesorios que permiten establecer múltiples formas de
funcionamiento y adaptarse al mayor número de aplicaciones posibles.

En la unidad 2 se habló superficialmente sobre alguno de ellos. Ahora es el momento de estudiarlos


con más profundidad. Se trata de una unidad con una gran componente teórica. Tómatelo con paciencia. No
es necesario que te aprendas de memoria todos los circuitos auxiliares que vas a ver, sino que sepas que
existen, para qué sirven y que acudas a la información oportuna cuando los necesites.

ÁREA DE TEORÍA

T-7.1 INTRODUCCIÓN
T-7.2 LAS PALABRAS DE CONFIGURACIÓN
T-7.2.1 Palabra CONFIG1
T-7.2.2 Palabra CONFIG2
T-7.2.3 Ahora tú

T-7.3 EL MÓDULO OSCILADOR


T-7.3.1 Control del oscilador
T-7.3.2 Modos del oscilador externo
T-7.3.2.1 El temporizador de arranque OST
T-7.3.2.2 El modo EC
T-7.3.2.3 Los modos LP, XT y HS
T-7.3.2.4 Los modos RC y RCIO

T-7.3.3 Modos del oscilador interno


T-7.3.3.1 Los modos INTOSC e INTOSCIO
T-7.3.3.2 El oscilador HFINTOSC
T-7.3.3.3 El oscilador LFINTOSC

T-7.3.4 Conmutación del reloj


T-7.3.5 Arranque con dos velocidades
T-7.3.6 Monitorización de la señal de reloj
T-7.3.7 Ciclo máquina/Ciclo de instrucción
T-7.3.8 Ahora tú

T-7.4 EL SUPERVISOR WATCHDOG


T-7.4.1 Ahora tú
T-7.5 EL MODO SLEEP DE BAJO CONSUMO
T-7.5.1 Final del modo sleep

T-7.6 EL RESET
T-7.6.1 Power On Reset (POR)
T-7.6.2 Patilla MCLR
T-7.6.3 Temporizador Power-Up Timer (PWRT)
T-7.6.4 Temporizador Oscillator Start-Up (OST)
T-7.6.5 Circuito Brown-Out Reset (BOR)
T-7.6.6 El registro de control de potencia PCON

7-1
www.mkelectronica.com Microcontroladores PIC: Nivel I
ÁREA DE PRÁCTICAS

P-7.1 AJUSTE DE LAS PALABRAS DE CONFIGURACIÓN


P-7.2 EJEMPLO 7-1: El oscilador interno
P-7.2.1 Descripción / Edición del programa fuente
P-7.2.2 Montaje eléctrico
P-7.2.3 Grabación del dispositivo y comprobaciones finales
P-7.2.4 Ahora tú

P-7-3 EJEMPLO 7-2: El supervisor Watchdog (WDT)


P-7.3.1 Descripción / Edición del programa fuente
P-7.3.2 Montaje eléctrico
P-7.3.3 Grabación del dispositivo y comprobaciones finales
P-7.3.4 Ahora tú

MATERIAL COMPLEMENTARIO

 PIC16F88X Data Sheet


 Presentaciones en Power Point
 Guía rápida de referencia
 Ejemplos y librerías de la Unidad 7
 Vídeo Unidad 7
 Soluciones Unidad 6
 Cuestionario

7-2
www.mkelectronica.com Microcontroladores PIC: Nivel I
AREA DE TEORÍA
T- 7.1 INTRODUCCIÓN

Todos los dispositivos PIC integran una serie de circuitos auxiliares o accesorios que mejoran el
rendimiento del sistema, eliminan componentes externos, minimizan el coste final del proyecto, ofrecen
protección del código grabado, reducen consumos, etc.

En esta unidad vamos a analizar los circuitos propios de la familia PIC16F88X en general, y del
PIC16F886 en particular. Muchos de estos accesorios son similares, incluso idénticos, en otros dispositivos
de la gama media PIC16FXXX y muy parecidos a los de la gama alta PIC18FXXXX y superiores. Se pueden
resumir en los siguientes:

 Palabras de configuración
 Circuito oscilador
 Supervisor o watchdog
 Circuitos de Reset

T-7.2 PALABRAS DE CONFIGURACIÓN

Sus bits se emplean para determinar diferentes formas de trabajo y de configuración del dispositivo
PIC, como puede ser el tipo de oscilador, protección o no del código, activación/desactivación del WDT,
etc… Todo ello se realiza mediante dos palabras de 14 bits cada una, que se almacenan en ciertas
posiciones de la memoria flash de programa, concretamente en las posiciones 0x2007 y 0x2008.

Estas posiciones corresponden a una región de memoria flash un tanto especial llamada memoria
de configuración. El rango previsto (aunque no usado ni implementado en su totalidad) para esta memoria,
va desde la dirección 0x2000 hasta la 0x3FFF, y sólo se puede acceder a ella durante el proceso de
grabación del dispositivo. No debes confundirla por tanto con la memoria flash donde hasta ahora grababas
tus programas.

En esta región especial o memoria de configuración se almacenan, según el modelo de PIC, los
propios bits de configuración, las palabras o valores de identificación ID, y cualquier otro tipo de parámetros
de configuración del sistema presentes o futuros.

T-7.2.1 Palabra de configuración CONFIG1

Cuando el PIC está borrado todos sus bits se ponen a “1”. Es el valor por defecto.

---- ---- /DEBUG LVP FCMEN IESO BOREN1 BOREN0


Bit 15 Bit 8

/CPD /CP MCLR /PWRTE WDTE FOSC2 FOSC1 FOSC0


Bit 7 Bit 0

Bits 15-14 No implementados, se leen como “1”


Bit 13 /DEBUG: Modo de depuración en circuito (ICD)
1 = Depurador desconectado. Las líneas RB6/ICSPCLK y RB7/ICSPDAT actúan
como líneas de E/S
0 = Depurador conectado. Las líneas RB6/ICSPCLK y RB7/ICSPDAT se destinan
al depurador
Bit 12 LVP: Grabación con bajo voltaje
1 = RB3/PGM actúa como PGM, habilitación de grabación en bajo voltaje
0 = RB3 actúa como E/S digital.

7-3
www.mkelectronica.com Microcontroladores PIC: Nivel I
Bit 11 FCMEN: a monitorización del reloj
1 = Monitorización activada
0 = Monitorización desactivada
Bit 10 IESO: Bit para la conmutación del reloj
1 = La conmutación de reloj interno/externo habilitada
0 = La conmutación de reloj interno/externo deshabilitada
Bit 9-8 BOREN<1:0>: Selección del Brown-out Reset (Reset por fallo de
alimentación)
11 = El sistema Brown-out Reset (BOR) activado
10 = BOR activado durante la ejecución y desactivado en el modo standby de
bajo consumo (SLEEP)
01 = El BOR se controla por software, mediante el bit SBOREN del registro
PCON
00 = El sistema BOR se desactiva
Bit 7 /CPD: Protección de la memoria EEPROM de datos
1 = Protección deshabilitada
0 = Protección habilitada
Bit 6 /CP: Protección de la memoria FLASH de programa
1 = Protección deshabilitada
0 = Protección habilitada
Bit 5 MCLR: Configuración de la patilla RE3/MCLR
1 = RE3/MCLR actúa como MCLR (Reset)
0 = RE3/MCLR actúa como entrada digital RE3. MCLR se conecta internamente
a Vdd
Bit 4 /PWRTE: Activación del temporizador Power-Up (PWRT) al conectar la
alimentación
1 = PWRT desactivado
0 = PWRT activado
Bit 3 WDT: Activación del supervisor o watchdog WDT
1 = WDT activado
0 = WDT desactivado. Puede activarse por software mediante el bit SWDTEN del
registro WDTCON
Bit 2-0 FOSC<2:0>: Selección del tipo de oscilador
111 = Oscilador RC. Salida CLKOUT por RA6 y red RC conectada a la entrada RA7
110 = Oscilador RCIO. RA6 E/S digital, RA7 entrada desde la red RC
101 = Oscilador interno INTOSC. RA6 salida CLKOUT y RA7 E/S digital
100 = Oscilador interno INTOSCIO. Las líneas RA6 y RA7 actúan como E/S digitales
011 = Oscilador externo EC. RA7 es E/S digital y RA7 entrada CLKIN del reloj externo
010 = Oscilador HS de alta velocidad. Entre RA6 y RA6 se conecta un cristal o un resonador
001 = Oscilador XT estándar. Entre RA6 y RA6 se conecta un cristal o un resonador
000 = Oscilador LP de bajo consumo. Entre RA6 y RA6 se conecta un cristal.

T-7.2.2 Palabra de configuración CONFIG2

Cuando el PIC está borrado todos sus bits se ponen a “1”. Es el valor por defecto.

---- ---- ---- ---- ---- WRT1 WRT0 BOR4V


Bit 15 Bit 8

---- ---- ---- ---- ---- ---- ---- ----


Bit 7 Bit 0

7-4
www.mkelectronica.com Microcontroladores PIC: Nivel I
Bits 15-11 No implementados, se leen como “1”
Bit 10-9 WRT<1:0>: Protección de escritura sobre la memoria Flash de programa
Modelos PIC16F883/PIC16F884
00 = Protegido desde 0x0000-0x07FF, desde 0x0800-0x0FFF puede modificarse
mediante EECON
01 = Protegido desde 0x0000-0x03FF, desde 0x0400-0x0FFF puede modificarse
mediante EECON
10 = Protegido desde 0x0000-0x00FF, desde 0x0100-0x0FFF puede modificarse
mediante EECON
11 = Se permite la escritura en la totalidad de la memoria flash de programa.
Modelos PIC16F886/PIC16F887
00 = Protegido desde 0x0000-0x0FFF, desde 0x1000-0x1FFF puede modificarse
mediante EECON
01 = Protegido desde 0x0000-0x07FF, desde 0x0800-0x1FFF puede modificarse
mediante EECON
10 = Protegido desde 0x0000-0x00FF, desde 0x0100-0x1FFF puede modificarse
mediante EECON
11 = Se permite la escritura en la totalidad de la memoria flash de programa.
Modelo PIC16F882
00 = Protegido desde 0x0000-0x03FF, desde 0x0400-0x07FF puede modificarse
mediante EECON
01 = Protegido desde 0x0000-0x00FF, desde 0x0100-0x07FF puede modificarse
mediante EECON
11 = Se permite la escritura en la totalidad de la memoria flash de programa.
Bit 8 BOR4V: Valor del Brown-out Reset que provoca el RESET si la tensión cae
por debajo de…
0 = Valor del BOR ajustado a 2.1V
1 = Valor del BOR ajustado a 4.0V
Bit 7-0 No implementados. Se leen como “1”

T-7.2.3 Ahora tú

Un sencillo ejercicio. Se trata de que codifiques los bits de ambas palabras de configuración para
que el controlador trabaje en las siguientes condiciones:

 Reset por fallo de alimentación (BOR) cuando el controlador esté ejecutando instrucciones y la
tensión caiga por debajo de los 2 V.
 Protección contra lectura tanto de la memoria FLASH de programa como de la EEPROM de datos.
 Tanto el PWRT como el el supervisor Watchdog deben estar activados.
 Oscilador del tipo XT mediante cristal de cuarzo externo de 4 MHz.
 Protección contra escritura del área de memoria FLASH de programa que va desde 0x0000 a
0x00FF
 El resto de opciones quedan configuradas por defecto.

CONFIG1

---- ---- /DEBUG LVP FCMEN IESO BOREN1 BOREN0

/CPD /CP MCLR /PWRTE WDTE FOSC2 FOSC1 FOSC0

7-5
www.mkelectronica.com Microcontroladores PIC: Nivel I
CONFIG2

---- ---- ---- ---- ---- WRT1 WRT0 BOR4V

---- ---- ---- ---- ---- ---- ---- ----

T-7.3 EL MÓDULO OSCILADOR

En las unidades anteriores has tenido la oportunidad de hacer diferentes programas en los que
usabas las puertas de E/S para el control de diferentes periféricos digitales. Esos programas, compuestos
de varias instrucciones, se ejecutaban y funcionaban de acuerdo a las especificaciones.

Sin embargo, hasta ahora no hemos tenido en cuenta al sistema encargado de generar las bases de
tiempo con las que se sincronizan todas las operaciones que realiza el microcontrolador y marcan el ritmo
con el que se ejecutan las instrucciones. Este sistema se conoce como “El módulo Oscilador”. Es
fundamental en cualquier
microcontrolador y lo vas a
estudiar en este apartado.

El módulo oscilador
dispone de varias fuentes de
reloj con diferentes
características, que permite
adaptarse a un amplio rango
de aplicaciones, maximizando
la eficiencia, eliminando
componentes externos y
minimizando el consumo.
Observa el esquema por
bloques de la figura.

El reloj general del sistema se puede obtener a partir de diferentes fuentes: osciladores externos,
resonadores de cristal de cuarzo, cerámicos o circuitos RC. También se puede obtener a partir de dos
osciladores internos integrados en el propio controlador y con diferentes velocidades que se pueden
seleccionar por programa. El oscilador interno HFINTOSC es un oscilador calibrado para alta frecuencia, el
LFINTOSC es un oscilador interno de baja frecuencia y sin calibrar.

Algunas de las características generales del módulo oscilador son:

 Fuente de reloj interna o externa que se puede seleccionar por software.


 Modo de arranque con dos velocidades para minimizar la latencia o tiempo de espera desde
que el oscilador externo se pone en marcha, hasta que se empiezan a ejecutar instrucciones.
 Sistema de monitorización de la fuente de reloj para detectar fallos en el oscilador externo y
poder conmutar automáticamente con el oscilador interno en caso de error.

El módulo oscilador se puede configurar en 8 modos distintos de trabajo. Se seleccionan mediante


los bits FOSC<2:0> de la palabra de configuración CONFIG1 que ya has visto en el apartado anterior:

1. EC: Oscilador externo. La patilla RA6/OSC2/CLKOUT actúa como E/S.


2. LP: Oscilador externo por cristal de cuarzo de bajo consumo a 32 KHz.
3. XT: Oscilador externo por cristal de cuarzo o resonador cerámico con una ganancia y
consumo medio.

7-6
www.mkelectronica.com Microcontroladores PIC: Nivel I
4. HS: Oscilador externo por cristal de cuarzo o resonador cerámico de alta ganancia y elevado
consumo.
5. RC: Oscilador mediante red RC externa conectada a la patilla RA7/OSC1/CLKIN. Por la
patilla RA6/OSC2/CLKOUT se obtiene la frecuencia de trabajo del sistema (Fosc/4).
6. RCIO: Oscilador mediante red RC externa. La patilla RA6/OSC2/CLKOUT actúa como E/S.
7. INTOSC: Oscilador interno. La patilla RA7/OSC1/CLKIN actúa como E/S y por
RA6/OSC2/CLKOUT se obtiene la frecuencia de trabajo del sistema (Fosc/4).
8. INTOSCIO: Oscilador interno. Las patillas RA7/OSC1/CLKIN y RA6/OSC2/CLKOUT actúan
como E/S.

T-7.3.1 Control del oscilador

En el área RAM de datos dispones de un registro especial (SFR), el OSCCON, que te permite
seleccionar de entre los diferentes modos del oscilador interno para ajustar la frecuencia general de trabajo
del sistema. También permite conocer el estado o “calidad” de las frecuencias generadas por dicho
oscilador.

NOMBRE: OSCCON (Control y estado del módulo DIR.: 0x8F BANCO: 1


oscilador)
U-0 R/W-1 R/W-1 R/W-0 R-1 R-0 R-0 R/W-0
---- IRCF2 IRFC1 IRFC0 OSTS HTS LTS SCS

Bit 7 No implementado, se lee como “0”


Bit 6-4 IRFC<2:0>: Selección de frecuencia de trabajo del oscilador interno
111 = 8 MHz
110 = 4 MHz (por defecto)
101 = 2 MHz
100 = 1 MHz
011 = 500 KHz
010 = 250 KHz
001 = 125 KHz
000 = 31 KHz (LFINTOSC)
Bit 3 OSTS: Estado del sistema de arranque (Start-up Time)
1 = El dispositivo está ejecutando instrucciones en base al oscilador definido
por FOSC<2:0> de la palabra de configuración CONFING1
0 = El dispositivo está ejecutando en base al oscilador interno (el HFINTOSC o el
LFINTOSC)
Bit 2 HTS: Bit de estado del oscilador interno HFINTOSC (frecuencias desde 125 KHz
hasta 8 MHz)
1 = El oscilador interno HFINTOSC está estable
0 = El oscilador interno HFINTOSC no está estabilizado
Bit 1 LTS: Bit de estado del oscilador interno LFINTOSC (frecuencia 31 KHz)
1 = El oscilador interno LFINTOSC está estable
0 = El oscilador interno LFINTOSC no está estable
Bit 0 SCS: Selección del sistema de reloj
1 = El sistema de reloj emplea el oscilador interno
0 = El sistema de reloj emplea el oscilador definido por los bits FOSC<2:0> de la palabra
de configuración CONFIG1

T-7.3.2 Modos de oscilador externo

Para generar la señal general de reloj del sistema, estos modos de oscilador necesitan de
componentes externos como generadores de reloj, cristales de cuarzo o resonadores cerámicos para los
modos LP, XT o HS, o bien una red resistencia/condensador para el modo RC.

7-7
www.mkelectronica.com Microcontroladores PIC: Nivel I
T-7.3.2.1 El temporizador de arranque OST

Cuando seleccionas un oscilador externo del tipo LP, XT o HS, se activa un pequeño temporizador
interno llamado temporizador de arranque OST (Oscillator Start-up Timer) que cuenta hasta 1.024 pulsos en
la patilla RA7/OSC1. Esto ocurre siempre que se produce una conexión de alimentación o POR (Power On
Reset), y el temporizador PWRT finaliza su temporización (ya hablaremos de él). También cuando se
produce la reanudación de la ejecución (wake-up) tras un periodo de standby de bajo consumo realizado
mediante la instrucción SLEEP.

Durante el tiempo que implica la cuenta de esos 1.024 pulsos, queda suspendida toda ejecución de
instrucciones. Esto garantiza que el programa comienza a ejecutarse sólo cuando el oscilador externo, con
su cuarzo o resonador, queda debidamente estabilizado tras conectar la alimentación.

Este tiempo de latencia o espera antes de comenzar la ejecución, puede resultar un inconveniente
en aquellas aplicaciones que precisen de un arranque instantáneo. Para solucionar estos casos, los
dispositivos PIC16F88X (entre otros) tienen la posibilidad de hacer un arranque en dos tiempos o
velocidades. Es lo que se conoce como el modo “Two-Speed Clock Start-up” que verás más adelante.
Podemos decir que consiste en que justo tras la conexión de alimentación, la ejecución comienza tomando
como base de tiempos al oscilador interno. Cuando el temporizador de arranque OST contabilice sus 1.024
pulsos, automáticamente se conmuta al modo de reloj externo.

T-7.3.2.2 El modo EC de oscilador externo

Tal y como se muestra en el esquema de la


figura, en el modo EC se emplea un
generador externo que proporciona la
frecuencia general de reloj del sistema. Ésta
se aplica al controlador a través de la patilla
RA7/OSC1/CLKIN. En esta ocasión la patilla
RA6/OSC2/CLKOUT actuará como una línea
de E/S convencional.

Al seleccionar este modo de oscilador, el temporizador de arranque OST del que hablábamos
anteriormente, queda desconectado. Por ese motivo no se intercala ninguna temporización entre la
conexión de alimentación o reanudación, y la
ejecución de las instrucciones, salvo que se
haya activado el temporizador PWRT.

Este modo de oscilador es precisamente


el que estás empleando en los diferentes
ejemplos que has realizado hasta ahora con el
laboratorio USB-PIC’School, y cuyo esquema se
muestra en la siguiente figura.

El dispositivo X2 (la cápsula plateda) es un oscilador integrado a cristal de cuarzo. Por su salida
OUT proporciona una señal de onda cuadrada cuya frecuencia depende del modelo. De serie es de 4 MHz,
pero fácilmente lo puedes cambiar por otro de distinta frecuencia. Cuando el jumper JP8 se coloca entre 1 y
2 (por defecto) esa señal se aplica a la patilla RA7/OSC1/CLKIN del controlador PIC.

Quizá también habrás observado que en los programas fuente de ejemplo usados hasta el momento
se incluye la directiva:

__config
_CONFIG1,LVP_OFF&_PWRTE_ON&_WDT_OFF&_EC_OSC&_FCMEN_OFF&_BOR_OFF

7-8
www.mkelectronica.com Microcontroladores PIC: Nivel I
Precisamente, el campo “_EC_OSC”, es el que selecciona en la palabra de configuración CONFIG1
el modo de oscilador EC, entre otras cosas.

T-7.3.2.3 Los modos LP, XT y HS

Estos modos precisan de un cristal de cuarzo o un resonador


cerámico conectado entre las patillas RA7/OSC1/CLKIN y
RA6/OSC2/CLKOUT, tal y como se muestra en el esquema de la
figura. A cada uno de ellos le corresponde una ganancia baja,
media o alta que se ajusta en el amplificador inversor interno.
Soporta así diferentes tipos comerciales de resonadores y
velocidades.

Modo LP: Este modo selecciona la mínima ganancia en el amplificador inversor interno, con lo que el
consumo es el más bajo de los tres modos. Está diseñado para trabajar con una frecuencia de unos 32 Khz.

Modo XP: Selecciona una ganancia intermedia a la que le corresponde un consumo medio. Ideal para
trabajar con frecuencias de hasta 8 MHz.

Modo HS: Emplea la máxima ganancia por lo que es el modo de oscilador que más consumo produce. Es el
modo ideal para trabajar con frecuencias desde los 8 MHz hasta los 20 MHz.

T-7.3.2.4 Los modos RC y RCIO

Estos modos necesitan de la conexión de una red RC


(resistencia/condensador) externa como se muestra en el
esquema de la figura. Debido a las tolerancias de esos
componentes, ambos modos son menos precisos que
cualquiera de los anteriores modos LP, XT o HS, sin embargo
son más económicos. Además, la frecuencia de trabajo se
puede modificar fácilmente variando el valor de ambos
componentes.

Modo RC: La red RC se conecta en la patilla RA7/OSC1/CLKIN. Por la patilla RA6/OSC2/CLKOUT se


obtiene la frecuencia de trabajo del sistema (Fosc/4).

Modo RCIO: La red RC también se conecta en la patilla RA7/OSC1/CLKIN. La patilla RA6/OSC2/CLKOUT


se comporta ahora como una línea de E/S de propósito general.

Los valores recomendados para REXT oscilan entre los 10 KΩ y los 100 KΩ y una alimentación
inferior a los 3 V. Con una alimentación de 3 a 5 V los valores recomendados para REXT oscilan entre los 3
KΩ y los 100 KΩ. El valor de CEXT debe ser mayor de 20 pF para cualquier alimentación de entre 2 y 5 V.

T-7.3.3 Modos de oscilador interno

El módulo oscilador que integran los dispositivos PIC16F88X dispone de dos osciladores internos
independientes que se pueden usar como fuente de reloj del sistema:

1. El oscilador HFINTOSC es de 8 MHz y viene calibrado de fábrica. Esta calibración puede


ser ligeramente modificada por el usuario mediante el registro OSCTUNE.
2. El oscilador LFINTOSC no está calibrado y su frecuencia es de 31 KHz.

Su empleo implica que puedes evitar conectar componentes externos como cristales, resonadores o
redes RC, con el ahorro que esto supone.

7-9
www.mkelectronica.com Microcontroladores PIC: Nivel I
Con los bits IRCF<2:0> del registro OSCCON que ya viste anteriormente, se controla un postcaler
con el que puedes seleccionar diferentes frecuencias de trabajo que van desde los 31 KHz hasta los 8 MHz,
a partir de estos osciladores internos.

De igual manera, mediante el bit SCS (System Clock Selection) del mismo registro OSCCON,
puedes seleccionar entre las dos fuentes de reloj: la externa o la interna.

T-7.3.3.1 Los modos INTOSC e INTOSCIO

Cualquiera de estos modos se selecciona mediante los bits FOSC<2:0> de la palabra de


configuración CONFIG1.

Modo INTOSC: La patilla RA7/OSC1/CLKIN se comporta como una línea de E/S de propósito general. Sin
embargo, por la patilla RA6/OSC2/CLKOUT se obtiene una señal con la frecuencia general de trabajo
(Fosc/4). Se puede usar como señal de reloj para circuitos externos, sincronización, calibración, test u otras
necesidades de la aplicación.

Modo INTOSCIO: Tanto la patilla RA7/OSC1/CLKIN como RA6/OSC2/CLKOUT se comportan como líneas
de E/S de propósito general.

T-7.3.3.2 El oscilador HFINTOSC

La frecuencia de salida de este oscilador interno está calibrada de fábrica a 8 MHz pero puede
modificarse por software mediante el registro OSCTUNE.

Su señal de salida se conecta con un postcaler y un multiplexor (mira el esquema general por
bloques), que permiten elegir entre 7 frecuencias de salida diferentes que van desde los 125 KHz hasta los
8 MHz. Se seleccionan mediante los bits IRCF<2:0> del registro OSCCON. El bit SCS de ese mismo
registro permite seleccionar entre oscilador interno o externo como fuente de reloj del sistema. También, en
el mismo registro OSCCON, tenemos el bit HTS que permite conocer si la frecuencia que genera
HFINTOSC es estable o no.

Mediante el registro OSCTUNE se puede modificar ligeramente el valor de la frecuencia que genera
el oscilador HFINTOSC. Para ello se introduce un valor de 5 bits en complemento a 2’s. Por defecto este
valor es 0 y coincide con la calibración de fábrica a 8 MHz.

NOMBRE: OSCTUNE (Calibración del oscilador interno DIR.: 0x90 BANCO: 1


HFINTOSC)
U-0 U-0 U-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0
---- ---- ---- TUN4 TUN3 TUN2 TUN1 TUN0

Bits 7-5 No implementados, se leen como “0”


Bit 4-0 TUN<4:0>: Bits de sintonía de frecuencia
01111 = Máxima frecuencia
01110 =
----
----
00001 =
00000 = Valor de calibración de fábrica a 8 MHz
11111 =
----
----
10000 = Mínima frecuencia

7-10
www.mkelectronica.com Microcontroladores PIC: Nivel I
T-7.3.3.3 El oscilador LFINTOSC

Se trata de otro oscilador de 31 KHz pero sin calibrar. Su salida se conecta con un postcaler (mira el
esquema general por bloques) y se selecciona mediante los bits IRCF<2:0> del registro OSCCON.

Además de generar la frecuencia de trabajo del sistema, el oscilador LFINTOSC también alimenta al
temporizador de conexión de alimentación PWRT (Power-up Timer), al supervisor WDT (watchdog) y al
circuito de monitorización de reloj FSCM (Fail-Safe Clock Monitor).

Este oscilador también se activa cuando se activan los siguientes componentes:

 El sistema de conmutación de reloj interno/externo mediante el bit IESO de la palabra de


configuración CONFIG1.
 El temporizador de conexión de alimentación (PWRT) mediante el bit /PWRTE de la palabra
de configuración CONFIG1.
 El supervisor watchdog (WDT) mediante el bit WDTE de la palabra de configuración
CONFIG1.
 El circuito de monitorización de reloj FSCM mediante el bit FCMEN de la palabra de
configuración CONFIG1.

El bit LTS del registro OSCCON indica si la frecuencia de salida del LFINTOSC es estable o no.

T-7.3.4 Conmutación del reloj

Una de las características del módulo oscilador de los dispositivos PIC16F88X es que te permite
seleccionar dinámicamente, por programa, entre el reloj interno y el externo como fuente de reloj del
sistema. Para ello debes emplear el bit SCS (System Clock Select) del registro OSCCON:

 Cuando este bit se pone a “0” la fuente de reloj del sistema es la externa, la que está
determinada por los bits FOSC<2:0> de la palabra CONFIG1 de configuración. Éste es el
valor por defecto del bit siempre que se produce un RESET del controlador.
 Cuando el bit SCS se pone a “1” la fuente de reloj es la interna. La frecuencia de trabajo la
seleccionas ahora mediante los bits IRCF<2:0> del registro OSCCON.

El bit OSTS del registro OSCCON informa en todo momento si se está trabajando con el oscilador
externo (a “1”) o el interno (a “0”) como fuente de reloj del sistema.

T-7.3.5 Arranque con dos velocidades

Si seleccionas el oscilador externo LP, XT o HS como fuente de reloj del sistema, se activa un
temporizador interno, el OST (Oscillator Start-up Timer), que temporiza o retrasa el arranque hasta contar
1.024 pulsos de ese oscilador externo.

Este retraso se produce cada vez que haya una secuencia de conexión de alimentación POR
(Power On Reset), o bien el controlador reanuda la ejecución tras encontrarse en el modo SLEEP de bajo
consumo. Con ello se garantiza que, cuando se inicia o reanuda la ejecución de instrucciones, ésta se
realice con un reloj debidamente estabilizado.

Sin embargo puede haber aplicaciones en las que este retraso sea un inconveniente. Imagina
aplicaciones en las que la ejecución del programa debe comenzar nada más conectar la alimentación. En
estos casos es cuando el arranque en dos tiempos o a dos velocidades puede resultarte muy útil. Para
activar esta prestación del módulo oscilador de los dispositivos PIC16F88X, debes seguir los siguientes
pasos:

1. El bit IESO de la palabra CONFIG1 de configuración debe ponerse a nivel “1”.


2. El bit SCS del registro OSCCON debe estar a nivel “0” (oscilador externo).

7-11
www.mkelectronica.com Microcontroladores PIC: Nivel I
3. Con los bits FOSC<2:0> de la palabra CONFIG1 de configuración se debe seleccionar uno de
estos tres modos de oscilador externo: LP, XT o HS.

La secuencia de arranque con dos velocidades es la siguiente:

1. Se produce un RESET o bien se reanuda la ejecución tras un estado de standby producido


por la instrucción SLEEP.
2. De forma casi inmediata se comienza la ejecución de instrucciones empleando para ello el
oscilador interno, a la frecuencia que en ese momento estén seleccionando los bits
IRCF<2:0> de OSCCON.
3. El temporizador OST comienza a contar los 1.024 ciclos procedentes del oscilador externo.
4. Al finalizar la cuenta el bit OSTS de OSCCON se activa.
5. El oscilador externo se conmuta y pasa a ser el que genera el reloj del sistema.

La figura muestra un diagrama de tiempos que resume el proceso de arranque a dos velocidades.

T-7.3.6 Monitorización de la señal de reloj

Imagina que estás utilizando cualquiera de los modos de oscilador


externo para generar la señal de reloj del sistema. ¿Qué ocurre si por
cualquier motivo falla ese oscilador externo? El controlador cancela
inmediatamente la ejecución de las instrucciones del programa y la aplicación
deja de funcionar ¡¡ catástrofe !!

Pues bien, otra de las posibilidades que ofrece el módulo oscilador de


los dispositivos PIC16F88X consiste en poder comprobar el estado del oscilador externo. Para ello dispone
de un circuito de monitorización de fallo de reloj, FSCM (Fail-Safe Clock Monitor), que permite detectar un
fallo en cualquiera de los modos de oscilador externo (LP, XT, HS, EC, RC y RCIO). Este circuito de
monitorización se activa mediante el bit FCMEN de la palabra CONFIG1 de configuración.

En la figura se muestra el esquema interno por


bloques del circuito de monitorización FSCM. La señal de
reloj del oscilador externo se compara constantemente con
una señal de referencia generada por el oscilador interno
LFINTOSC y dividida entre 64, lo que hace un periodo de
muestreo de 2 mS. Si transcurre este tiempo sin que se
detecte la señal procedente del oscilador externo, se genera
la condición de error.

Cuando se detecta un fallo en el oscilador externo, el


sistema conmuta automáticamente al oscilador interno, a la

7-12
www.mkelectronica.com Microcontroladores PIC: Nivel I
frecuencia que en ese momento estén seleccionando los bits IRCF<2:0> del registro OSCCON. Al mismo
tiempo se activa el bit OSFIF del registro PIR2 que informa de esta situación. Si tuviéramos activado el bit
OSFIE del registro PIE2 se produciría también una interrupción cuyo tratamiento actuaría en consecuencia.
Todo esto se resume en el diagrama de tiempos de la figura.

Para anular la condición de error basta con:

 Generar un RESET
 Ejecutar la instrucción SLEEP
 Cambiar de estado el bit SCS del registro OSCCON

T-7.3.7 El Ciclo Máquina/Ciclo de instrucción

Sea cual sea el tipo de oscilador empleado (interno o externo), estamos hablando del oscilador que
genera la frecuencia principal del sistema, también conocida como “Fosc”, y con un periodo Tosc (1/Fosc).
Sin embargo, existe una unidad de tiempo mucho más utilizada y que se conoce como “Ciclo Máquina o
Ciclo de Instrucción”. Esta unidad de tiempo, se obtiene a partir de la frecuencia Fosc del sistema, y
emplea siempre 4 ciclos o estados Q del reloj principal. Ver la figura. Determina el tiempo que tarda en
ejecutarse una instrucción.

En las diferentes unidades de este curso aparecen con cierta frecuencia los siguientes términos:

 Fosc Frecuencia principal del reloj del sistema (p.e. 4 MHz).


 Tosc Representa el periodo del reloj y se corresponde con la función inversa de la
frecuencia (1/Fosc). Por ejemplo, si Fosc = 4 MHz, Tosc = 1/4 MHz = 250 nS.
 4Tosc=Fosc/4 Representa el ciclo máquina o ciclo de instrucción. Corresponde con 4
ciclos Tosc del reloj. Es la unidad de tiempo que más vamos a utilizar. Por ejemplo, si
Tosc = 250 nS, 4 Tosc = 1 µS. Éste será el tiempo que tarda en ejecutarse cualquier
instrucción.

A modo de ejemplo, en la siguiente tabla se muestran diferentes frecuencias de trabajo y sus


correspondientes periodos y ciclos de instrucción.

7-13
www.mkelectronica.com Microcontroladores PIC: Nivel I
Fosc 31 KHz 1 MHz 4 MHz 8 MHz 20 MHz
Tosc 32 µS 1 µS 250 nS 125 nS 50 nS
4 Tosc=Fosc/4 129 µS 4 µS 1 µS 0.5 µS 0.2 µS

T-7.3.8 Ahora tú

Con estos ejercicios se trata de que practiques con algunos de los conceptos que se han visto en
este apartado dedicado al módulo oscilador.

Ejercicio 1

Se desea trabajar con un oscilador interno a 500 KHz y aprovechar así las patillas RA6 y RA7 como
líneas de E/S de propósito general, al tiempo que ahorramos componentes externos. Codificar
adecuadamente los bits que intervienen en los siguientes registros. El resto de bits déjalos en sus valores
por defecto.

CONFIG1

---- ---- /DEBUG LVP FCMEN IESO BOREN1 BOREN0

/CPD /CP MCLR /PWRTE WDTE FOSC2 FOSC1 FOSC0

CONFIG2

---- ---- ---- ---- ---- WRT1 WRT0 BOR4V

---- ---- ---- ---- ---- ---- ---- ----

OSCCON

NOMBRE: OSCCON (Control y estado del módulo DIR.: 0x8F BANCO: 1


oscilador)
---- IRCF2 IRFC1 IRFC0 OSTS HTS LTS SCS

Ejercicio 2

La aplicación necesita un arranque instantáneo a dos velocidades. Al conector la alimentación el


sistema arranca con el oscilador interno. Transcurridos los 1023 ciclos del temporizador OST se emplea un
oscilador externo del tipo XT

Codificar adecuadamente los bits que intervienen en los siguientes registros. El resto de bits déjalos
en sus valores por defecto.

CONFIG1

---- ---- /DEBUG LVP FCMEN IESO BOREN1 BOREN0

/CPD /CP MCLR /PWRTE WDTE FOSC2 FOSC1 FOSC0

7-14
www.mkelectronica.com Microcontroladores PIC: Nivel I
CONFIG2

---- ---- ---- ---- ---- WRT1 WRT0 BOR4V

---- ---- ---- ---- ---- ---- ---- ----

OSCCON

NOMBRE: OSCCON (Control y estado del módulo DIR.: 0x8F BANCO: 1


oscilador)
---- IRCF2 IRFC1 IRFC0 OSTS HTS LTS SCS

Ejercicio 3

La aplicación trabaja con un generador externo conectado por la patilla RA7/OSC1/CLKIN como
fuente general de reloj. Sin embargo, en previsión de posibles fallos, el sistema deberá poder conmutar al
reloj interno con una frecuencia de 8 MHz si hubiera algún error en ese generador externo.

Codificar adecuadamente los bits que intervienen en los siguientes registros. El resto de bits déjalos
en sus valores por defecto.

CONFIG1

---- ---- /DEBUG LVP FCMEN IESO BOREN1 BOREN0

/CPD /CP MCLR /PWRTE WDTE FOSC2 FOSC1 FOSC0

CONFIG2

---- ---- ---- ---- ---- WRT1 WRT0 BOR4V

---- ---- ---- ---- ---- ---- ---- ----

OSCCON

NOMBRE: OSCCON (Control y estado del módulo DIR.: 0x8F BANCO: 1


oscilador)
---- IRCF2 IRFC1 IRFC0 OSTS HTS LTS SCS

T-7.4 EL SUPERVISOR WATCHDOG

En lo que llevamos de curso ya ha salido en varias ocasiones el circuito auxiliar llamado supervisor
o watchdog (WDT). También se le conoce como “perro guardián”, pero ¿qué es realmente el WDT? Es un
circuito temporizador/contador que va evolucionando hasta llegar al máximo y, que si nadie se lo impide,
termina desbordándose provocando un RESET del controlador. El sistema se reinicia.

7-15
www.mkelectronica.com Microcontroladores PIC: Nivel I
El supervisor WDT se puede activar o no mediante el bit WDTE de la palabra CONFIG1 de
configuración, o mediante el bit SWDTEN del registro WDTCON que ahora verás. Si lo desactivas, te
puedes olvidar de él, como si no existiera.

Ahora bien, si lo activas, lo tendrás que vigilar y evitar que finalice la cuenta y provoque el RESET.
Esto lo debes hacer mediante la instrucción CLRWDT, que refresca o reinicia la cuenta del WDT cada vez
que se ejecuta. A partir de ahora debes diseñar tus programas e insertar estratégicamente esta instrucción,
de forma que siempre se ejecute antes de que el WDT finalice su temporización.

Según esto, parece que el WDT no es más que un quebradero de cabeza del que te tienes que
preocupar. Pues bien, resulta que en ocasiones su empleo está más que justificado.

Imagina un equipo o sistema autónomo que debe trabajar con la mínima intervención humana
posible. En condiciones normales el PIC ejecuta el programa que gestiona el buen funcionamiento de ese
equipo o aplicación. Sin embargo puede ocurrir que, por causas varias (interferencias, fallos en el sistema,
etc.), el programa se bloquee o se meta en un bucle sin fin. En esta situación la instrucción CLRWDT que,
tan estratégicamente habías puesto para su refresco, no se ejecuta. El WDT sigue avanzando en su cuenta
hasta que se desborda y provoca el RESET. El controlador se reinicia automáticamente sin intervención
alguna por tu parte.

Las características del supervisor WDT que incorporan los dispositivos de la familia PIC16F88X se
resumen a continuación:

 Toma como base de tiempos para la temporización, el oscilador LFINTOSC interno con
una frecuencia de 31 KHz.
 Dispone de un preescaler de 16 bits.
 Dispone de otro preescaler de 8 bits que es compartido con el Timer 0.
 El periodo o tiempo para su desbordamiento va desde 1 mS hasta los 268 segundos.
 Dicho tiempo se puede ajustar por software.

En la siguiente figura puedes ver el esquema por bloques.

El WDT se habilita activando el bit WDTE de la palabra CONFIG1 de configuración, o bien el bit
SWDTEN del registro WDTCON. La base de tiempos procede del oscilador interno LFINTOSC a 31 KHz
con un periodo de 32 µS. Esta señal va a parar a un preescaler de 16 bits que la divide por un factor
ajustable mediante los bits WDTPS<3:0> del registro WDTCON.

Si el bit PSA del registro OPTION (el que vimos en unidad 2), se encuentra a “1”, al WDT se le
asocia otro preescaler. En este caso es de 8 bits y su factor de división se ajusta mediante los bits
PSA<2:0> de ese mismo registro OPTION.

7-16
www.mkelectronica.com Microcontroladores PIC: Nivel I
Los ajustes del tiempo en que se producirá el desbordamiento del supervisor WDT, se realizan por
tanto mediante los bits PSA<2:0> del registro OPTION y mediante los bits del registro WDTCON que se
muestra a continuación.

NOMBRE: WDTCON (Registro de control del supervisor WDT) DIR.: 0x105 BANCO: 2
U-0 U-0 U-0 R/W-0 R/W-1 R/W-0 R/W-0 R/W-0
---- ---- ---- WDTPS3 WDTPS2 WDTPS1 WDTPS0 SWDTEN

Bits 7-5 No implementados, se leen como “0”


Bit 4-1 WDTPS<3:0>: Ajuste del preescaler de 16 bits del supervisor del WDT
0000 = 1:32
0001 = 1:64
0010 = 1:128
0011 = 1:256
0100 = 1:512 (valor por defecto tras el RESET)
0101 = 1:1024
0110 = 1:2048
0111 = 1:4096
1000 = 1:8192
1001 = 1:16384
1010 = 1:32768
1011 = 1:65536
11xx = Reservado
Bit 0 SWDTEN: Activación por software del WDT
1 = Supervisor WDT activado
0 = La activación del WDT depende del bit WDTE de la palabra CONFIG1 de
configuración

Por defecto, y suponiendo que el preescaler de 8 bits controlado desde el registro OPTION no está
asociado al WDT, el tiempo nominal de desbordamiento es de unos 17 mS (32 µS es el periodo de 31 KHz
por el valor 512 por defecto tras el RESET). El valor mínimo sería de 1 mS (32 µS x 32) y el máximo de 2.11
seg. (32 µS x 65536).

Si además, mediante el registro OPTION asociamos también el preescaler de 8 bits al WDT, el


tiempo mínimo sería de 1 mS (32 µS x 32 x1) y el máximo de 270 segundos (32 µS x 65536 x 128).

Sea como fuere, cada vez que el WDT se desborda por no haber sido refrescado a tiempo mediante
la instrucción CLRWDT, el bit /TO del registro STATUS se pone a “0” y se provoca un RESET. El programa
de arranque o inicio puede testear ese bit para conocer si el RESET se provocó por otras causas o bien
como consecuencia del desbordamiento del WDT, en cuyo caso quizá debiera hacerse un tratamiento
diferente.

T-7.4.1 Ahora tú

Se trata de activar el watchdog (WDT) y ajustarlo para que desborde y provoque el RESET cada 8
segundos (aprox.) si no es refrescado previamente mediante la instrucción CLRWDT.

Codificar adecuadamente los bits que intervienen en los siguientes registros. El resto de bits déjalos
en sus valores por defecto. Posiblemente encuentres que hay varias posibilidades. Prueba con varias.

CONFIG1

---- ---- /DEBUG LVP FCMEN IESO BOREN1 BOREN0

7-17
www.mkelectronica.com Microcontroladores PIC: Nivel I
/CPD /CP MCLR /PWRTE WDTE FOSC2 FOSC1 FOSC0

CONFIG2

---- ---- ---- ---- ---- WRT1 WRT0 BOR4V

---- ---- ---- ---- ---- ---- ---- ----

WDTCON

NOMBRE: WDTCON (Registro de control del supervisor WDT) DIR.: 0x105 BANCO: 2
---- ---- ---- WDTPS3 WDTPS2 WDTPS1 WDTPS0 SWDTEN

OPTION_REG

Nombre: OPTION_REG Dirección: 0x01 Bancos: 1 y 3


/RBU INTEDG T0CS T0SE PSA PSA2 PSA1 PSA0

T-7.5 EL MODO SLEEP DE BAJO CONSUMO

Este concepto también ha aparecido en diferentes ocasiones. Consiste en dejar al controlador en


modo de espera (standby) y se consigue al ejecutar la instrucción SLEEP. En este momento el PIC deja de
ejecutar instrucciones y su consumo se reduce a la mínima expresión (unos 50 nA trabajando a 2 V). Cada
vez que se pone al PIC en el modo SLEEP:

 El supervisor WDT se refresca y empieza una nueva temporización.


 El bit /PD del registro de STATUS se pone a “0”.
 El bit /TO del registro STATUS se pone a “1”.
 El sistema oscilador se desconecta. y deja de ejecutarse instrucciones.
 Las puertas de E/S mantienen el estado previo a la ejecución de la instrucción SLEEP
 El consumo se reduce drásticamente.

T-7.5.1 Final del modo SLEEP

Se dice que cuando finaliza el modo SLEEP el PIC “despierta” (wake-up) y reanuda la ejecución
justo después de la propia instrucción SLEEP. Tres son las formas de “despertar” al controlador para que
reanude la ejecución:

1. Provocar un RESET externo mediante la patilla MCLR.


2. Desbordamiento del WDT (si está activado).
3. Interrupción mediante la patilla RB0/INT, interrupción por cambio de estado en la Puerta
B o interrupciones provocadas por ciertos periféricos.

Cuando la reanudación o el “despertar” del PIC se produce a causa de un RESET externo, te


puedes servir de los bits /TO y /PD del registro STATUS para averiguar si ese RESET ha sido provocado o
no por desbordamiento del WDT y, en ese caso, si el PIC se encontraba o no en el modo SLEEP.

Imagina una aplicación en la que el controlador tiene que realizar una tarea cada cierto tiempo.
Cuando finaliza esa tarea lo pones en el modo SLEEP hasta que el WDT desborde. Se produce un RESET
y un nuevo arranque. La tarea se vuelve a ejecutar y finaliza nuevamente en el modo SLEEP. Sólo existe

7-18
www.mkelectronica.com Microcontroladores PIC: Nivel I
consumo en el momento de ejecución de la tarea, luego éste consumo se reduce al mínimo (del orden de
nano amperios). Piensa en sistemas alimentados con pilas o baterías.

No todos los periféricos pueden provocar interrupciones cuando el sistema se encuentra en el modo
SLEEP ya que este modo implica la desconexión del sistema de reloj y, por tanto, el funcionamiento de los
mismos. Otros en cambio sí que pueden seguir trabajando y por tanto “despertar” y reanudar la ejecución:

1. El Timer 1 cuando trabaja en el modo asíncrono.


2. El módulo ECCP en el modo de captura.
3. El convertidor ADC cuando la fuente de reloj es FRC.
4. Cuando se completa un ciclo de escritura sobre la EEPROM de datos.
5. Cuando las salidas del comparador cambian de estado.
6. Interrupción por cambio de estado en las líneas de entrada de la Puerta B.
7. Interrupción externa mediante la patilla RB0/INT.
8. Al detectar la condición BREAK en el módulo EUSART.

T-7.6 EL RESET

Como ya sabes, la secuencia por la que el controlador se reinicia y comienza a ejecutar el programa
de la aplicación, se la conoce como secuencia “RESET”. Los dispositivos de la familia PIC16F88X disponen
de diferentes recursos para generar esta secuencia:

 Al conectar la alimentación general del sistema. Se le conoce como “Power On Reset” (POR).
 Desbordamiento del supervisor WDT cuando el controlador se encuentra ejecutando el
programa.
 Desbordamiento del supervisor WDT cuando el controlador se encuentra detenido, en
standby, en el modo SLEEP de bajo consumo.
 Al activar la patilla MCLR en cualquier momento durante la ejecución del programa.
 Al activar la patilla MCLR cuando el controlador se encuentra detenido, en standby, en el
modo SLEEP de bajo consumo.
 Al detectar una caída en la tensión de alimentación por debajo de un determinado valor de
umbral. Se le conoce como “Brown-out Reset” (BOR).

Cuando se genera un RESET algunos bits de los registros especiales (SFR) se cargan con unos
valores predeterminados, otros bits pueden permanecer sin modificarse y otros pueden adquirir un valor
aleatorio. Fíjate que en cada uno de los registros especiales estudiados hasta el momento, se ha venido
indicando cómo quedan sus correspondientes bits tras el RESET. Repasa si quieres el apartado T-2.2.4.

En la siguiente figura
tienes el esquema
simplificado por
bloques del circuito de
RESET que integran
los dispositivos PIC
16F88X. Es muy
parecido al de otros
dispositivos PIC de
otras familias.

7-19
www.mkelectronica.com Microcontroladores PIC: Nivel I
T-7.6.1 Power-On RESET (POR)

Consiste en un circuito interno que monitoriza la tensión de alimentación aplicada al controlador.


Cuando esta se estabiliza y alcanza el valor adecuado se genera la señal de RESET y el sistema comienza
a ejecutar el programa de la aplicación. El circuito POR es insensible a caídas de tensión transitorias. Para
que se produzca una nueva secuencia de RESET, es necesario que la tensión de alimentación caiga a 0 V
durante al menos 100 µS.

T-7.6.2 MCLR

Se trata de la patilla RE3/MCLR (pin 1). Por ella puedes provocar un RESET del sistema desde el
exterior. Es una patilla activa por nivel lógico “0”. Dispone de un filtro interno que evita falsas señales de
RESET provocadas por pulsos externos de muy corta duración.

Mediante el bit MCLRE de la palabra de configuración CONFIG1 puedes determinar el


funcionamiento de esta patilla. Si le pones a nivel “1” se comporta como entrada MCLR para el RESET
externo. Si le pones a nivel “0” la patilla se comporta como una entrada digital de propósito general (RE3).
La función MCLR queda internamente conectada a Vdd (nivel “1”) y por tanto anulada.

T-7.6.3 Temporizador Power-Up Timer (PWRT)

Se trata de otro circuito interno que realiza una temporización fija de 66 mS, cada vez que se
11
detecta el Power-on Reset. Consiste en un contador de 11 bits capaz de contar 2.048 eventos (2 ) que
proporciona el oscilador interno LFINTOSC de 31 KHz ((1/31.000)*2.048=0,066 seg).

El controlador se mantiene detenido, en RESET, mientras se realiza esta cuenta. Al final de la


misma se comienza con la ejecución. El objetivo de esta temporización consiste en esperar a que la tensión
Vdd de alimentación se estabilice y alcance el valor apropiado, antes de que el controlador comience a
ejecutar instrucciones. Es decir, el controlador comienza a trabajar 66 mS después de conectar la
alimentación.

En algunas aplicaciones este retraso puede no ser deseado. Por este motivo, mediante el bit
PWRTE de la palabra de configuración CONFIG1 tienes la posibilidad de activar o no al temporizador
PWRT. Si ese bit lo pones a nivel “0” se activa. Si lo pones a nivel “1” el PWRT queda desactivado. En este
caso el “arranque” o comienzo de la ejecución es casi instantáneo, pero debes asegurarte de que la
alimentación también sea instantánea (p.e. mediante un sistema de pilas o baterías).

T-7.6.4 Temporizador Oscillator Start-up (OST)

Ya se ha hablado de el. Se trata de otro temporizador que retrasa el arranque del controlador.
Consiste en un contador de 10 bits que se alimenta desde el oscilador general externo conectado por la
patilla RA7/OSC1/CLKIN (en los modos de oscilador LP, XT y HS). Su función consiste en contar 1.024
10
pulsos (2 ) de ese reloj externo, esperando así a la estabilización del mismo. El temporizador OST se pone
en marcha una vez que finaliza la temporización del PWRT (si es que estuviera activado). La temporización
total viene determinada por la frecuencia del oscilador general (1/Fosc), es decir Tosc * 1024.

En la siguiente tabla se resumen los tiempos de arranque del controlador para los diferentes modos
de oscilador y en función de si el temporizador PWRT está o no habilitado. Recuerda: TPWRT = 66 mS

7-20
www.mkelectronica.com Microcontroladores PIC: Nivel I
Tipo de RESET por conexión de RESET por caída de Salida del
oscilador alimentación (POR) tensión (BOR) modo
PWRTE=0 PWRTE=1 PWRTE=0 PWRTE=1 SLEEP
(“despertar”)
XT,HS,LP TPWRT + Tosc * 1024 TPWRT + Tosc * 1024 Tosc * 1024
Tosc * 1024 Tosc * 1024
RC,EC,INTOSC TPWRT ------ TPWRT ------ ------

En la figura tienes un diagrama de tiempos


con la secuencia de arranque del
controlador. En ella se considera un reloj
externo (p.e. XT), que la patilla MCLR está
conectada a Vdd y que el temporizador
PWRT está habilitado.

Cuando se conecta la alimentación (Vdd)


se genera la señal POR. En este instante
comienza la temporización TPWRT (66 mS).
Cuando esta finaliza comienza la
temporización TOST (Tosc * 1024)). Al
finalizar se libera el estado de RESET y el
controlador comienza a ejecutar el
programa de la aplicación.

T-7.6.5 Circuito Brown-out Reset (BOR)

Otra forma de provocar un RESET al sistema. Se trata de un circuito interno capaz de detectar
caídas en la tensión Vdd de alimentación por debajo de un determinado valor o umbral. Si esto ocurriera se
producirá una secuencia de RESET. Mediante los bits BOREN0 y BOREN1 de la palabra de configuración
CONFIG1 se selecciona de entre los 4 modos de trabajo posibles:

BOREN1 BOREN0 MODO


0 0 Circuito BOR desconectado
0 1 El circuito BOR se controla por software,
mediante el bit SBOREN del registro PCON
1 0 El circuito BOR se activa sólo en el modo normal.
Se desconecta en el modo SLEEP
1 1 El circuito BOR siembre activado

Mediante el bit BOR4V de la palabra de configuración CONFIG2 se selecciona el umbral de la


tensión a detectar. Cuando vale “0” la tensión de umbral a detectar se establece en 2.1 V, cuando vale nivel
“1” el umbral es de 4.0 V.

En la siguiente figura tienes un


diagrama de tiempos con diferentes
situaciones en las que se detecta una caída
de tensión Vdd. Se supone que el
temporizador PWRT está habilitado. Por
ello, la secuencia de arranque, se demora
en 66 mS.:

Caso 1: La tensión de alimentación Vdd cae


por debajo de VBOR durante un breve
instante de tiempo. El reinicio se produce 66
mS después de que Vdd supere a VBOR.

7-21
www.mkelectronica.com Microcontroladores PIC: Nivel I
Caso 2: La tensión de alimentación Vdd cae por debajo de VBOR, se repone durante un tiempo inferior a 66
mS y luego vuelve a caer. El reinicio se produce 66 mS después de que Vdd supere a VBOR y se estabilice.

Caso 3: La tensión de alimentación cae por debajo de VBOR durante un tiempo prolongado. El reinicio se
produce 66 mS después de que Vdd supere a VBOR

T-7.6.6 El registro de control de potencia PCON

Entre otros, dispone de dos bits de estado que permiten determinar el tipo de RESET que se ha
producido. También permite o no activar por software el circuito BOR. Se muestra a continuación.

NOMBRE: PCON (Registro de control de potencia) DIR.: 0x8E BANCO: 1


U-0 U-0 R/W-0 R/W-1 U-0 U-0 R/W-0 R/W-x
---- ---- ULPWUE SBOREN ---- ---- /POR /BOR

Bits 7-5 No implementados, se leen como “0”


Bit 5 ULPWUE: Permite o no “despertar” desde el modo SLEEP empleando la patilla
RA0 de bajo consumo
1 = Despertar en bajo consumo desde RA0 activado
0 = Despertar en bajo consumo desde RA0 desactivado
Bit 4 SBOREN: Activación del BOR por software (si los bits BOREN<1:0> de la palabra
de configuración CONFIG1=01)
1 = BOR activado
0 = BOR desactivado
Bits 3-2 No implementados, se leen como “0”
Bit 1 /POR: Bit de estado de la conexión de alimentación Power-on Reset (POR)
1 = No ha habido conexión de alimentación Power-on Reset (POR)
0 = Ha habido conexión de alimentación (POR)
Bit 0 /BOR: Bit de estado del circuito de detección de caídas de tensión Brown-
out Reset (BOR)
1 = No se ha detectado caída de tensión Vdd
0 = Se ha detectado caída de tensión Vdd y se ha generado RESET

En la siguiente tabla se combinan los bits /TO y /PD del registro STATUS con los bits /POR y /BOR
del registro PCON. Durante la secuencia de arranque o inicio, haciendo un análisis de los mismos, podrás
averiguar la causa que provocó el RESET.

/POR /BOR /TO /PD Causa del RESET


0 X 1 1 Conexión de alimentación Power-on Reset (POR)
U 0 1 1 RESET al detectar caída de la tensión Vdd (BOR)
U U 0 U RESET por desbordamiento del supervisor WDT
U U 0 0 Salida del modo SLEEP (“despertar”) por
desbordamiento del supervisor WDT
U U U U Activación de la patilla RE3/MCLR (RESET externo) en
el modo normal de ejecución.
U U 1 0 Activación de la patilla RE3/MCLR (RESET externo) en
el modo SLEEP de bajo consumo (standby)
U=bit que no se modifica; X= bit aleatorio

En el material complementario dispones del data sheet completo de los dispositivos PIC16F88X que
proporciona Microchip. En él encontrarás cómo quedan todos los registros internos especiales
(SFR) cada vez que se produce una secuencia de RESET en cualquiera de sus formas. Tienes toda la
información técnica disponible de primera mano.

7-22
www.mkelectronica.com Microcontroladores PIC: Nivel I
AREA DE PRÁCTICAS

P-7.1 AJUSTE DE LAS PALABRAS DE CONFIGURACIÓN

Recuerda que a las palabras de configuración sólo se puede acceder durante el ciclo de grabación
del PIC. Mediante el entorno de trabajo MPLAB-IDE las puedes ajustar según tus necesidades antes de
proceder a esa grabación. Basta con que selecciones Configure  Configuration Bits. Se abre una
ventana como la mostrada en la figura.

Cuando seleccionas cualquiera de los campos a configurar, aparece un desplegable con las
diferentes opciones posibles para ese campo.

Otra forma de determinar la configuración de trabajo del PIC y, bajo nuestro punto de vista la más
correcta, consiste en incluirla en el propio programa fuente. De esta forma, cuando se ensambla o compila
dicho programa, se obtiene un fichero ejecutable (*.HEX) que lleva incrustado toda esa información.

Luego, cuando el software de grabación abre el fichero *.HEX a grabar, se obtiene no solo el
programa que hay que escribir sobre la memoria flash de programa, también se obtiene el estado de los bits
de configuración según los hayamos ajustado en el programa fuente. Fíjate en las siguientes directivas:

__config _CONFIG1,LVP_OFF&_PWRTE_ON&_WDT_OFF&_EC_OSC&_FCMEN_OFF&_BOR_OFF
__config _CONFIG2, _WRT_OFF

¿Te recuerdan algo? Efectivamente, son las directivas que has empleado en todos los ejemplos
realizados hasta el momento y que seguirás empleando en lo sucesivo. Establecen el estado que deseas
para los diferentes bits de los registros CONFIG1 y CONFIG2 de configuración. Sus etiquetas están
definidas en el fichero “P16F886.INC” y se corresponden con las que acabas de estudiar (LVP, PWRT,
WDT, etc…)

Esta forma de proceder permite obtener un fichero ejecutable (*.HEX) muy compacto y con toda la
información que necesita el software de grabación para grabar correctamente el dispositivo PIC. Su uso es
muy recomendable.

P-7.2 EJEMPLO 7-1: El oscilador interno

Con este ejemplo se trata de mostrar una de las posibilidades de los dispositivos PIC16F88X (entre
otros). Consiste en conmutar y seleccionar el oscilador interno (INTOSC) como oscilador general de trabajo.
Esto te brinda la oportunidad de poder seleccionar frecuencias (F) de trabajo que van desde los 31 KHz
(LFINTOSC) hasta los 8 MHz, y periodos (Tosc) desde los 32,25 µS hasta los 0.125 µS (Tosc=1/F)
respectivamente.

7-23
www.mkelectronica.com Microcontroladores PIC: Nivel I
La selección de la frecuencia se realiza mediante tres interruptores del laboratorio USB-PIC’School
que se conectan con las líneas RA0:RA2 de entrada. De forma dinámica, durante la ejecución del programa,
podrás variar esa frecuencia y modificar así los tiempos de ejecución.

T-7.2.1 Descripción/Edición del programa fuente

El programa se basa en la rutina RA2:RA0 FRECUENCIA CICLO CAMBIO EN RB0


“Delay” de temporización que, mediante una 000 31 KHz 129 µS 64,5 seg.
serie de bucles anidados, consume unos 001 125 KHz 32 µS 16 seg.
500.000 ciclos de instrucción (1 ciclo=4*Tosc). 010 250 KHz 16 µS 8 seg.
El valor binario de las entradas RA0:RA2 011 500 KHz 8 µS 4 seg.
(procedente de los interruptores) se emplea 100 1 MHz 4 µS 2 seg
para seleccionar en OSCCON el valor de la 101 2 MHz 2 µS 1 seg.
frecuencia de trabajo. Según sea ésta, la rutina 110 4 MHz 1 µS 0,5 seg.
“Delay” tardará más o meno tiempo en 111 8 MHz 0.5 µS 0,25 seg.
ejecutarse a pesar de consumir el mismo número de ciclos de instrucción. Se producen así temporizaciones
diferentes.

Al final de cada temporización, la salida RB0 cambia de estado. En la tabla de arriba se muestra una
relación entre el valor de RA2:RA0, la frecuencia de trabajo, el tiempo de un ciclo máquina y el tiempo que
tarda RB0 en cambiar de estado (ciclo máquina * 500000).

P-7.2.2 Montaje eléctrico


E0 RA0 S0 RB0

E1 RA1 S1
Se muestra en la figura. Los interruptores E0:E2 se E2 RA2 S2
conectan con las patillas RA0:RA2 respectivamente E3 S3
que actúan como entradas. El led S0 del laboratorio
E4 S4
se conecta con la patilla RB0 que actúa como salida.
E5 S5
Este led producirá una intermitencia variable en
E6 S6
función del valor de los interruptores.
E7 S7

E. DIGITALES
SALIDAS DIGITALES

P-7.2.3 Grabación del dispositivo y comprobaciones finales

Cuando ya hayas trabajado y experimentado con la depuración, selecciona el modo grabador y


graba el PIC con el programa definitivo. Coloca el conmutador en la posición RUN y comprueba que el
programa funciona correctamente.

La salida S0 conectada en RB0 parpadea a un ritmo que varía en función de las entradas RA2:RA0.
Debes tener en cuenta que, según la tabla anterior, cuando se selecciona la frecuencia interna de trabajo de
31 KHz (RA2=RA1=RA0=0), el cambio en RB0 se produce ¡cada 64,5 segundos!

P-7.2.4 Ahora tú

No hay mucho trabajo que desarrollar sobre este sencillo, pero útil ejemplo. Simplemente que debes
de tener en cuenta la presencia del oscilador interno en los dispositivos PIC16F88X y sus posibilidades. Los
diseños y proyectos se pueden ver muy beneficiados en un aspecto fundamental:

El oscilador interno evita el uso de un oscilador externo y sus componentes asociados. Esto
ahorrará costes y espacio en el diseño final.

Ahora te propongo que hagas un sencillo experimento.

7-24
www.mkelectronica.com Microcontroladores PIC: Nivel I
1. Desconecta la alimentación del laboratorio.
2. Con cuidado, retira el oscilador externo (la cápsula metálica que se encuentra a la derecha de los
diplays de 7 segmentos). Fíjate cómo se encuentra para dejarlo luego exactamente igual.
3. Vuelve a conectar la alimentación. ¿Funciona el programa? _____________
4. Desconecta la alimentación del laboratorio.
5. Vuelve a colocar el oscilador. Fíjate que el ángulo marcado con un “punto” (·) debe quedar orientado
hacia arriba a la izquierda.
6. Vuelve a conectar la alimentación. ¿Funciona el programa? _____________

Explicación:

A pesar de que el programa va a emplear el oscilador interno como reloj general del sistema,
cuando retiras el oscilador externo no funciona. Ten en cuenta que en la palabra de configuración has
seleccionado el oscilador externo (EC_OSC):

__config _CONFIG1, _LVP_OFF&_PWRTE_ON&_WDT_OFF&_EC_OSC&_FCMEN_OFF&_BOR_OFF


__config _CONFIG2, _WRT_OFF&_BOR40V

Si este lo retiras no podrán ejecutarse las instrucciones que permiten precisamente seleccionar y
conmutar al oscilador interno.

P-7-3 EJEMPLO 7-2: El supervisor Watchdog (WDT)

Se trata de demostrar cómo mediante el WDT se puede provocar un RESET de forma periódica si
no se le refresca a tiempo. También vamos a ver cómo es posible que nuestro programa distinga si el
RESET se provoca por desbordamiento del WDT, o bien por la activación de la patilla MCLR y/o conexión
de la tensión de alimentación. Para ello vamos a emplear dos leds del laboratorio USB-PIC’School que
producirán un flash en función del tipo de RESET producido:

1. Flash de 0,4 seg. sobre el led S3 conectado con la salida RB3, si el RESET se produce por
activación de la patilla MCLR o cada vez que se conecte la alimentación del sistema (Power On
Reset).

2. Flash de 0,1 seg sobre el led S0 conectado con la salida RB0, cada vez que el RESET se provoca
por un desbordamiento del supervisor WDT.

Por otra parte, el WDT que incorporan los dispositivos PIC16F88X, dispone de un prescaler que
permite ajustar el desbordamiento con 12 intervalos distintos, que van desde los 0.13 segundos hasta los
270. Vamos a emplear los interruptores E0:E3 conectados con las entradas RA0:RA3 para ajustar, en el
registro WDTCON, uno de esos intervalos según la siguiente tabla:

RA3:RA0 WDTCON TIEMPO (s) RA3:RA0 WDTCON TIEMPO (s)


0000 32 0.13 0110 2048 8.45
0001 64 0.26 0111 4096 16.91
0010 128 0.52 1000 8192 33.82
0011 256 1.05 1001 16384 67.64
0100 512 2.11 1010 32768 135.28
0101 1024 4.22 1011 65536 270.60

P-7.3.1 Descripción del programa fuente

Como ya has visto en el área de teoría, el supervisor WDT consiste en un temporizador que se
alimenta desde un oscilador interno, independiente del sistema y con una frecuencia F de 31 KHz (periodo
T=32 µS). Dispone de un prescaler de 8 bits que se selecciona desde el registro OPTION_REG. En el
presente ejemplo se ha elegido un prescaler fijo de 128. También dispone de un prescaler de 16 bits y con
12 intervalos distintos que se seleccionan desde el registro WDTCON. El valor de este último lo vamos a

7-25
www.mkelectronica.com Microcontroladores PIC: Nivel I
seleccionar mediante las entradas RA3:RA0. El tiempo total de desbordamiento será por tanto de 32 µS *
128 * WDTCON y oscilará entre los 0,13 seg y los 270,6 seg. como se mostró en la tabla anterior.

En la secuencia de inicio, el programa chequea el bit NOT_TO del registro STATUS para determinar
si el RESET se ha producido al accionar la patilla MCLR y/o al conectar la alimentación, o bien si ha sido por
desbordamiento del WDT. Realiza así la intermitencia correspondiente y actualiza, mediante el registro
WDTCON, el nuevo valor del prescaler con el valor actual de las entradas conectadas en RA3:RA0.

P-7.3.2 Montaje eléctrico

E0 RA0 S0 RB0

E1 RA1 S1 Lo tienes en la figura. Los interruptores E0:E3 del


E2 RA2 S2 laboratorio se conectan con las líneas RA0:RA3
E3 RA3 S3 RB3 respectivamente que actuarán como entradas. Los
E4 S4 leds S0 y S3 se conectan con las líneas RB0 y RB3
E5 S5
respectivamente. Actuarán como salidas.
E6 S6

E7 S7

E. DIGITALES
SALIDAS DIGITALES

P-7.3.3 Grabación del dispositivo y comprobaciones finales

Cuando ya hayas trabajado y experimentado con la depuración, selecciona el modo grabador y


graba el PIC con el programa definitivo. Coloca el conmutador en la posición RUN y comprueba que el
programa funciona correctamente.

Simplemente comprueba que el ejemplo cumple con sus expectativas. Nada más conectar la
alimentación (o generar MCLR con el botón RESET), se debe producir un flash de 0,4 segundos sobre el led
S3 conectado con RB3.

A partir de este momento, observaremos que el led S0 conectado en RB0 produce un flash de 0,1
seg. de forma periódica cada vez que desborda el WDT. La duración del periodo se puede modificar con las
entradas RA3:RA0, haciéndolo con más o menos frecuencia.

P-7.3.4 Ahora tú

Como trabajo personal te propongo hacer un programa en el que cada vez que desborde el WDT se
lea el estado de una entrada (p.e RA0) y se refleje en una salida (p.e. RB0). El resto del tiempo, entre un
desbordamiento y el siguiente, el controlador deberá encontrarse en el modo SLEEP de bajo consumo.

Esto permite incidir en un par de importantes detalles:

1. Hay aplicaciones que sólo requieren la intervención del controlador de forma periódica,
cada cierto tiempo. Imagina que se trata de monitorizar el estado de una o más entradas
que varían de forma muy dilatada en el tiempo.

2. Cuando el controlador no está trabajando lo ponemos en el modo SLEEP. Con esto


conseguimos reducir el consumo drásticamente hasta que el WDT desborde.

7-26
www.mkelectronica.com Microcontroladores PIC: Nivel I
UNIDAD 8: MEMORIAS EEPROM/FLASH Y LAS INTERRUPCIONES

OBJETIVOS

Por un lado se trata de estudiar y de poner a tu disposición tanto la memoria EEPROM de datos
como la memoria FLASH de programa. Considera a ambos tipos de memorias como si de un periférico se
tratara. Usando los registros apropiados puedes usarlas para leer y escribir información sobre ellas.

La memoria EEPROM está pensada para guardar sobre ella todo tipo de datos NO volátiles pero
modificables. Imagina una aplicación de control de accesos. La clave de acceso en algún lugar tiene que
estar guardada. No se debe borrar, aunque ocasionalmente quizá sea necesario modificarla. Esta memoria
es ideal para este tipo de aplicaciones

La memoria FLASH la estás usando constantemente cada vez que grabas un nuevo programa.
También la puedes usar para guardar datos no volátiles pero modificables. Sin embargo su mayor utilidad
radica en que tu programa de aplicación puede escribir sobre ella otros nuevos programas. Es el clásico
caso de los conocidos como “Bootloaders”. Se trata de un pequeño programa residente en una zona de la
memoria FLASH y capaz de recibir instrucciones desde el exterior (p.e. vía serie, I2C, SPI, etc…). Estas se
almacenan en la memoria FLASH conformando el nuevo programa que se debe ejecutar. Es decir, puedes
hacer programas que permitan escribir nuevos programas.

Por otra parte vamos a tocar el tema de las interrupciones. La mayor parte de los periféricos que
integran los dispositivos PIC de las distintas familias, tienen capacidad de interrumpir. Esto es, reclamar la
atención del controlador cuando suceda algún tipo de evento. El controlador abandona temporalmente el
programa que esté ejecutando en ese momento y pasa a ejecutar un programa para el tratamiento de la
interrupción. Al finalizar este, el controlador retorna al programa original ejecutando las instrucciones a partir
del lugar en que fue abandonado.

ÁREA DE TEORÍA

T-8.1 CONTROL DE LAS MEMORIAS EEPROM DE DATOS Y FLASH DE PROGRAMA


T-8.1.1 Los registros EEADR y EEADRH de direccionamiento
T-8.1.2 Los registros EEDAT y EEDATH de datos
T-8.1.3 Los registros EECON y EECON2
T-8.1.4 Secuencia de lectura de la EEPROM de datos
T-8.1.5 Secuencia de escritura sobre la EEPROM de datos
T-8.1.6 Secuencia de lectura de la FLASH de programa
T-8.1.7 Secuencia de escritura sobre la FLASH de programa

T-8.2 LAS INTERRUPCIONES


T-8.2.1 Generalidades
T-8.2.2 Las interrupciones en los dispositivos PIC16F88X
T-8.2.3 El registro INTCON
T-8.2.4 Los registros PIR1 y PIE1
T-8.2.5 Los registros PIR2 y PIE2
T-8.2.6 Salvando el contexto
T-8.2.7 Ahora tú

ÁREA DE PRÁCTICAS

P-8.1 EJEMPLO 8-1: Interrupción externa RB0/INT y el modo SLEEP


P-8.1.1 Descripción / Edición del programa fuente
P-8.1.2 Montaje eléctrico
P-8.1.3 Grabación del dispositivo y comprobaciones finales

8-1
www.mkelectronica.com Microcontroladores PIC: Nivel I
P-8.1.4 Ahora tú

P-8-2 EJEMPLO 8-2: Interrupción por cambio de estado


P-8.2.1 Descripción / Edición del programa fuente
P-8.2.2 Montaje eléctrico
P-8.2.3 Grabación del dispositivo y comprobaciones finales
P-8.2.4 Ahora tú

P-8-3 EJEMPLO 8-3: Control del teclado mediante interrupción por cambio de estado
P-8.3.1 Descripción / Edición del programa fuente
P-8.3.2 Montaje eléctrico
P-8.3.3 Grabación del dispositivo y comprobaciones finales

P-8-4 EJEMPLO 8-4: La memoria EEPROM y la máquina “Su Turno”


P-8.4.1 Descripción / Edición del programa fuente
P-8.4.2 Montaje eléctrico
P-8.4.3 Grabación del dispositivo y comprobaciones finales
P-8.4.4 Ahora tú

P-8-5 EJEMPLO 8-5: La memoria EEPROM, control de accesos


P-8.5.1 Descripción / Edición del programa fuente
P-8.5.2 Montaje eléctrico
P-8.5.3 Grabación del dispositivo y comprobaciones finales
P-8.5.4 Ahora tú

MATERIAL COMPLEMENTARIO

 Guía rápida de referencia


 Ejemplos y librerías de la Unidad 8
 Vídeo Unidad 8
 Soluciones Unidad 7
 Cuestionario

8-2
www.mkelectronica.com Microcontroladores PIC: Nivel I
AREA DE TEORÍA

T-8.1 CONTROL DE LAS MEMORIAS EEPROM DE DATOS Y FLASH DE PROGRAMA

La memoria FLASH de programa la has venido utilizando para almacenar los programas de los
distintos ejemplos que has realizado hasta el momento. Sin embargo, debes pensar en esta memoria como
si de otro periférico se tratara. Efectivamente, esta memoria la pñuedes emplear en tus propios programas
para leer y escribir sobre ella información de todo tipo (instrucciones y datos), bajo la ejecución de los
mismos. En el caso de los dispositivos PIC16F88X dispones de hasta 8 K palabras de 14 bits de memoria
FLASH no volátil que puede albergar tanto el programa de tu aplicación como los datos, siempre y cuando
no se superpongan y anulen entre sí. Piensa, por ejemplo, en aplicaciones en las cuales es necesario
reescribir, actualizar o modificar el propio programa o firmware contenido en el controlador. La escritura
sobre la memoria FLASH se puede permitir o no
a nivel de bloques, según los bits WRT0 y WRT1
de la palabra CONFIG2 de configuración
estudiada en la unidad anterior. Puedes proteger
un área de esta memoria contra escrituras no
deseadas.

Por otra parte dispones también de una


memoria EEPROM exclusivamente para
almacenar datos. Se trata también de una
memoria no volátil, que se gestiona como si de
un periférico se tratara y con una capacidad para
albergar hasta 256 bytes. Imagina aplicaciones en las que sea necesario registrar códigos de acceso,
claves, identificaciones, versiones, parámetros de configuración etc... Dispones de una memoria de datos no
volátil, pero cuya información la puedes modificar.

T-8.1.1 Los registros EEADR y EEADRH de direccionamiento

Son dos registros especiales (SFR) que, como todos los demás, se encuentran en el área RAM de
datos. Se emplean para direccionar tanto la memoria FLASH de programa como la EEPROM de datos,
seleccionando la posición sobre la que se desea leer o escribir. Según se muestra en la figura, el registro
EEADR aporta los 8 bits de menos peso para el direccionamiento de la memoria FLASH. También se
emplea para direccionar directamente las 256 posiciones de la EEPROM de datos. Por su parte, el registro
EEADRH aporta los 5 bits de más peso para el direccionamiento de la memoria FLASH.

Con los 8 bits del registro EEADR se puede direccionar una de las 256 posiciones existentes en la
8
memoria EEPROM de datos (2 =256). Cuando se accede a la memoria FLASH el registro EEADR aporta
los 8 bits de menos peso. En este caso, el registro EEADRH aporta los 5 bits de más peso, generando así
una dirección de 13 bits que permite el acceso a cualquiera de las 8192 posiciones de este tipo de memoria
13
(2 =8192). Ambos registros se muestran a continuación.

8-3
www.mkelectronica.com Microcontroladores PIC: Nivel I
NOMBRE: EEADR (Registro de direcciones para la EEPROM y DIR.: 0x10D BANCO: 2
la FLASH)
R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0
EEADR7 EEADR6 EEADR5 EEADR4 EEADR3 EEADR2 EEADR1 EEADR0

NOMBRE: EEADRH (Registro de direcciones para la DIR.: 0x10F BANCO: 2


FLASH)
U-0 U-0 U-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0
---- ---- ---- EEADR12 EEADR11 EEADR10 EEADR9 EEADR8

T-8.1.2 Los registros EEDAT y EEDATH de datos

Se trata de otros dos registros especiales (SFR) que actúan como buffers para la transferencia de
datos con las memorias FLASH y EEPROM. Cuando se realiza un ciclo de lectura de una de esas
memorias, estos registros se cargan con el valor recién leído procedente de las mismas. Cuando se realiza
un ciclo de escritura, estos registros se deben cargar previamente con la información a escribir.

El registro EEDAT se emplea para la transferencia de información con la memoria EEPROM de


datos. Este registro también aporta los 8 bits de menos peso si se accede a la memoria FLASH. En este
caso los bits de más peso se suponen almacenados en el registro EEDATH.

Observa la figura anterior. Dado que la memoria EEPROM tiene una anchura de 8 bits por cada
posición, el registro EEDAT es suficiente para la transferencia de datos con ella. Sin embargo, la memoria
FLASH, tiene una anchura de 14 bits por cada posición. En este caso es necesario el empleo de los dos
registros: el EEDAT aporta los 8 bits de menos peso y el EEDATH los 6 bits de más peso. Ambos se
muestran a continuación:

NOMBRE: EEDAT (Registro de datos para la EEPROM y la DIR.: 0x10C BANCO: 2


FLASH)
R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0
EEDAT7 EEDAT6 EEDAT5 EEDAT4 EEDAT3 EEDAT2 EEDAT1 EEDAT0

NOMBRE: EEDATH (Registro de datos para la FLASH) DIR.: 0x10E BANCO: 2


U-0 U-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0
---- ---- EEDAT13 EEDAT12 EEDAT11 EEDAT10 EEDAT9 EEDAT8

8-4
www.mkelectronica.com Microcontroladores PIC: Nivel I
T-8.1.3 Los registros EECON1 y EECON2

Mediante el registro EECON1 mostrado a continuación, puedes controlar todas las operaciones
relativas a la lectura/escritura tanto de la memoria EEPROM de datos como de la memoria FLASH de
programa.

NOMBRE: EECON1 (Registro de control Nº 1 para la DIR.: 0x18C BANCO: 3


lectura/escritura de las memorias EEPROM/FLASH)
R/W-x U-0 U-0 U-0 R/W-x R/W-0 R/S-0 R/S-0
EEPGD ---- ---- ---- WRERR WREN WR RD

Bit 7 EEPGD: Selecciona el tipo de memoria a emplear


1 = Acceso a la memoria FLASH de programa
0 = Acceso a la memoria EEPROM de datos
Bit 6-4 No implementados, se leen a nivel “0”
Bit 3 WRERR: Bit de error en la escritura
1 = El ciclo de escritura ha finalizado prematuramente (causado por cualquier tipo
de RESET)
0 = El ciclo de escritura se ha completado correctamente
Bit 2 WREN: Bit de habilitación del ciclo de escritura
1 = Permite los ciclos de escritura
0 = Ciclos de escritura no permitidos
Bit 1 WR: Control de escritura
1 = Inicia un nuevo ciclo de escritura. Se pone a “0” automáticamente al finalizar
0 = Ciclo de escritura finalizado
Bit 0 RD: Control de lectura
1 = Inicia un nuevo ciclo de lectura. Se pone a “0” automáticamente al finalizar
0 = Ciclo de lectura finalizado o no iniciado.

Por su parte el registro EECON2, es un registro ficticio que se usa exclusivamente en la secuencia
establecida por Microchip para los ciclos de escritura. Se muestra a continuación y su lectura devuelve el
valor “0”.

NOMBRE: EECON2 (Registro de control Nº 2 para la DIR.: 0x18D BANCO: 3


escritura de las memorias EEPROM/FLASH)
-0 -0 -0 -0 -0 -0 -0 -0
---- ---- ---- ---- ---- ---- ---- ----

T-8.1.4 Secuencia de lectura de la EEPROM

Aquí tienes la secuencia necesaria para realizar un ciclo de lectura de la memoria EEPROM de
datos. Es muy sencilla y se resume a continuación:

1. Seleccionar el banco 2.
2. Cargar el registro EEADR con la dirección cuyo dato se desea leer.
3. Seleccionar el banco 3.
4. Borrar el bit EEPGD del registro EECON1 para acceder a la EEPROM de datos.
5. Activar el bit RD del registro EECON1 para iniciar el ciclo de lectura.
6. Seleccionar el banco 2.
7. Leer el registro EEDAT que contendrá el byte recién leído desde la EEPROM.

A modo de ejemplo vamos a traducir los pasos anteriores a instrucciones en ensamblador.

bcf STATUS,RP0
bsf STATUS,RP1 ;Selecciona el banco 2
movlw Direccion

8-5
www.mkelectronica.com Microcontroladores PIC: Nivel I
movwf EEADR ;Carga el registro EEADR con la dirección que se desea leer
bsf STATUS,RP0 ;Selecciona el banco 3
bcf EECON1,EEPGD ;Selecciona el acceso a memoria EEPROM
bsf EECON1,RD ;Inicia el ciclo de escritura
bcf STATUS,RP0 ;Selecciona el banco 2
movf EEDAT,W ;Carga en W el dato recién leído

T-8.1.5 Secuencia de escritura sobre la EEPROM

A continuación se resumen los pasos para proceder a realizar un ciclo de escritura de un dato sobre
la memoria EEPROM:

1. Seleccionar el banco 2.
2. Cargar el registro EEADR con la dirección sobre la que se desea escribir.
3. Cargar en el registro EEDAT el dato a escribir.
4. Seleccionar el banco 3.
5. Borrar el bit EEPGD del registro EECON1 para acceder a la EEPROM de datos.
6. Activar el bit WREN del registro EECON1 para dar permiso de escritura.
7. Ejecutar, sobre el registro EECON2, la secuencia de escritura establecida por Microchip.
8. Activar el bit WR del registro EECON1 para iniciar el ciclo de escritura.
9. Esperar a que finalice (el bit WR se debe poner a “0”).
10. Desactivar el bit WREN del registro EECON1 para anular el permiso de escritura.

Estos mismos pasos, traducidos a instrucciones en ensamblador, se muestran a continuación:

bcf STATUS,RP0
bsf STATUS,RP1 ;Selecciona el banco 2
movlw Direccion
movwf EEADR ;Carga registro EEADR con la dirección a escribir
movlw Dato
movwf EEDAT ;Carga el registro EEDAT con el dato a escribir
bsf STATUS,RP0 ;Selecciona el banco 3
bcf EECON1,EEPDG ;Selecciona acceso a memoria EEPROM de datos
bsf EECON1,WREN ;Permiso de escritura
movlw 0x55
movwf EECON2
movlw 0xAA
movwf EECON2 ;Secuencia de escritura según Microchip
bsf EECON1,WR ;Inicio del ciclo de escritura
wait btfsc EECON1,WR
goto wait ;Esperar que finalice (WR=0)
bcf EECON1,WREN ;Retira el permiso de escritura

T-8.1.6 Secuencia de lectura de la memoria FLASH de programa

La secuencia a seguir se resume en los siguientes pasos:

1. Seleccionar el banco 2.
2. Cargar el registro EEADRH con la parte alta de la dirección a leer.
3. Cargar el registro EEADR con la parte baja de la dirección a leer.
4. Seleccionar el banco 3.
5. Activar el bit EEPGD del registro EECON1 para acceder a la FLASH de programa.
6. Activar el bit RD del registro EECON1 para iniciar el ciclo de lectura.
7. Ejecutar la secuencia establecida por Microchip.
8. Seleccionar el banco 2.
9. Leer el registro EEDAT que contiene los 8 bits de menos peso del dato leído.
10. Leer el registro EEDATH que contiene los 6 bits de más peso del dato leído.

8-6
www.mkelectronica.com Microcontroladores PIC: Nivel I
Traducido a instrucciones en ensamblador nos puede quedar algo parecido a esto:

bcf STATUS,RP0
bsf STATUS,RP1 ;Selecciona el banco 2
movlw Direccon_H
movwf EEADRH ;Carga EEADRH con la parte alta de la dirección
movlw Direccion_L
movwf EEADR ;Carga EEADR con la parte baja de la dirección
bsf STATUS,RP0 ;Selecciona el banco 3
bsf EECON1,EEPDG ;Acceso a la memoria FLASH de programa
bsf EECON1,RD ;Inicia el ciclo de lectura
nop
nop ;Secuencia establecida por Microchip
bcf STATUS,RP0 ;Selecciona el banco 2
movf EEDATH,W
movwf Dato_H ;Recupera y salva la parte alta del dato leído
movf EEDAT,W
movwf Dato_L ;Recupera y salva la parte baja del dato leído

T-8.1.7 Secuencia de escritura sobre la memoria FLASH de programa

En primer lugar hay que insistir en las precauciones que debes tomar a la
hora de escribir información sobre esta memoria. Piensa que, si la
ejecución de tu programa (que también se encuentra en la misma
memoria FLASH), implica escribir información sobre ella, es posible que
dicha información destruya al propio programa si se sobre escribe sobre
él. Pare evitar esta situación, debes asegurarte que empleas un área de la
memoria FLASH distinta a donde se encuentra el propio programa. El
controlador dispone de un mecanismo de seguridad que, en la medida de
lo posible, trata de evitar escrituras en regiones no deseadas.

Este mecanismo se encuentra en la palabra CONFIG2 de configuración.


Mediante los bits WRT<1:0> es posible proteger contra escritura
diferentes bloques. Consulta el apartado T-7.2.2 de la Unidad 7 anterior.
Como norma general los programas deben alojarse en bloques que estén
debidamente protegidos contra escrituras no deseadas.

En el caso del
dispositivo PIC16F886 la
escritura sobre la
memoria FLASH se hace
siempre en bloques de 8
words o palabras
consecutivas de 14 bits
cada una. La dirección
inicial en EEADR debe
ser siempre múltiplo de 8,
lo que implica que sus
tres bits de menos peso
deben valer siempre
“000”. Nuestro programa
debe enviar de forma
secuencial y consecutiva las 8 palabras. Estas se irán almacenando en otros tantos buffers internos antes
de grabarse físicamente en la memoria. Observa el esquema por bloques de la figura.

8-7
www.mkelectronica.com Microcontroladores PIC: Nivel I
Los registros EEADRH y EEADR deben contener la dirección inicial de la memoria FLASH sobre la
que se va a escribir. Esta dirección debe ser múltiplo de 8 y direcciona al primero de los 8 buffers internos
(EEADR<2:0>=000). La pareja de registros EEDATH y EEDATA contienen los 14 bits de la palabra grabar y
que se almacenará en el registro buffer direccionado. EEADRH y EEADR se incrementan para direccionar al
siguiente registro buffer donde se almacenará el siguiente word.

Secuencialmente se van almacenando las 8 palabras que forman un bloque, sobre sus
correspondientes registros buffer. Cuando se escribe el último (EEADR<2:0>=111), se procede a grabar
físicamente la FLASH.

El ejemplo que se muestra a continuación presenta la secuencia sugerida por Microchip para
escribir un bloque de 8 words sobre la FLASH de programa.

bcf STATUS,RP0
bsf STATUS,RP1 ;Selecciona el banco 2
movf Dir_H,W
movwf EEADRH ;Carga la parte alta de la dirección inicial de la FLASH
movf Dir_L,W
movwf EEADR ;Carga la parte baja de la dirección inicial de la FLASH
movf Data_Dir,W
movwf FSR ;Inicia el buffer de datos a grabar
Loop movf INDF,W
movwf EEDATA ;Almacena la parta baja del dato a grabar
incf FSR,F ;Siguiente byte
movf INDF,W
movwf EEDATH ;Almacena la parte alta del dato a grabar
incf FSR,F ;Siguiente byte
bsf STATUS,RP0 ;Selecciona el banco 3
bsf EECON1,EEPGD ;Selecciona acceso a memoria FLASH de programa
bsf EECON1,WREN ;Habilita la escritura
movlw 0x55
movwf EECON2
movlw 0xAA
movwf EECON2 ;Secuencia de Microchip
bsf EECON1,WR ;Inicia ciclo de escritura
nop
nop ;Secuencia de Microchip
bcf EECON1,WREN ;Inhabilitación de escritura
bcf STATUS,RP0 ;Selecciona el banco 2
movf EEADR,W
incf EEADR,F ;Siguiente dirección del siguiente registro buffer
andlw 0x0f
sublw 0x07
btfss STATUS,Z ;Es el último word del bloque de 8 ??
goto Loop ;No, grabar en el buffer el siguiente word
----- ;Si

T-8.2 LAS INTERRUPCIONES

A grandes rasgos se puede definir a una interrupción como el mecanismo por el cual el controlador
abandona la tarea o programa actualmente en ejecución, llamado “programa principal”, para pasar a
ejecutar una nueva tarea llamada “programa de tratamiento de la interrupción”. Finalizado este programa
de tratamiento, el controlador reanuda la ejecución del programa principal en el punto en que lo abandonó.

8-8
www.mkelectronica.com Microcontroladores PIC: Nivel I
T-8.2.1 Generalidades

Pueden ser varios los eventos o fuentes que provocan una


interrupción. En general suelen ser los propios periféricos que, en
determinadas condiciones, generan esta situación. Por ejemplo,
cuando un Timer finaliza una temporización, cuando se detecta un
determinado tipo de señal por una patilla de entrada, cuando un
convertidor ADC finaliza una conversión, cuando se recibe un carácter
serie por el USART y un largo etcétera.

El empleo de interrupciones te puede resultar al principio un tanto complejo, pero el resultado final
puede ser espectacular en cuanto al rendimiento y eficacia del sistema se refiere. Imagina un sencillo
ejemplo en el que configuramos un temporizador o Timer para que, cada vez que transcurra un segundo, se
ejecute una determinada tarea.

Si no contemplas el empleo de interrupciones, el programa deberá estar continuamente leyendo ese


Timer, esperando a detectar en qué momento finaliza la temporización y ejecutar así la correspondiente
tarea. Observa que, mientras estás esperando a que el Timer finalice, el controlador no puede estar
realizando ningún otro trabajo. ¡Estás perdiendo un tiempo precioso de ejecución!

Ahora bien, puedes configurar al Timer para que temporice un segundo y provoque una interrupción
cuando finalice. En este caso el controlador puede estar haciendo cualquier otro trabajo mientras el Timer
realiza el suyo. Cuando transcurre el tiempo establecido se produce una interrupción, el controlador la
atiende y ejecuta la tarea correspondiente. No hay un tiempo de espera, el controlador está en constante
ejecución.

Quédate con la idea de que mediante el empleo de interrupciones el controlador no tiene que
esperar a que los periféricos finalicen su tarea. El controlador está ejecutando su trabajo y serán los propios
periféricos quienes le avisen, mediante interrupciones, solicitando su atención. La siguiente figura muestra la
secuencia que realiza el controlador cada vez que
se produce una interrupción:

1. En un arranque normal, tras la conexión de


alimentación, se produce el RESET. El PC
se carga con 0x0000 (vector de RESET) y
ejecuta la instrucción “GOTO Inicio”.
2. A partir de este punto comienza la
ejecución del programa de aplicación o
“Programa principal”.
3. En un momento determinado se produce
una interrupción solicitada por algún
periférico.
4. Se termina de ejecutar la instrucción en
curso (PC=X). El valor actual del PC más
uno, se salva sobre la memoria de stack.
5. El PC se carga con 0x0004 (Vector de
interrupción).
6. Se ejecuta la instrucción “GOTO Inter”.
7. Comienza la ejecución del programa de
tratamiento de la interrupción.
8. Dicho programa debe finalizar con la
instrucción de retorno “RETFIE”.
9. La ejecución de esa instrucción implica
recuperar desde la memoria de stack, el
valor del PC+1. Se reanuda así la
ejecución del programa principal desde
donde se abandonó.

8-9
www.mkelectronica.com Microcontroladores PIC: Nivel I
T-8.2.2 Las interrupciones en los dispositivos PIC16F88X

Son muy similares a las de las diferentes familias de dispositivos PIC. En la figura tienes el esquema
eléctrico interno del circuito de interrupciones. No te asustes por su aparente complejidad, simplemente te
puede dar una idea de funcionamiento. Cada fuente de interrupción se controla básicamente mediante dos
bits: el bit F que permite conocer el estado de un determinado periférico, y el bit E que permite o no que ese
periférico provoque interrupción al controlador.

A continuación tienes un listado con las diferentes fuentes de interrupción disponibles:

 Interrupción externa por la patilla RB0/INT.


 Interrupción por desbordamiento de los temporizadores Timer 0, Timer 1 y Timer 2.
 Interrupción por cambio de estado en cualquiera de las patillas de la Puerta B que estén
configuradas como entradas y debidamente habilitadas.
 Interrupción producida por cualquiera de los dos comparadores C1 y C2.
 Interrupción cuando el convertidor ADC finaliza una conversión.
 Interrupción al finalizar un ciclo de escritura sobre la memoria EEPROM de datos.
 Interrupción cuando el circuito de monitorización del reloj (FSCM) detecta un fallo en el
reloj del sistema.
 Interrupción desde los módulos CCP1 y CCP2 durante la captura y/o, comparación.
 Interrupción desde el USART, en la transmisión/recepción de caracteres.
 Interrupción mediante el wake-up (“despertar”) por RA0 de muy bajo consumo.

8-10
www.mkelectronica.com Microcontroladores PIC: Nivel I
 Interrupción desde el módulo MSSP para las comunicaciones serie síncronas en los
modos I2C y SPI.
Algunos de los periféricos capaces de provocar una interrupción no son objeto de estudio en este
curso, quizá en otro curso futuro de mayor nivel. En este, estás estudiando y trabajando con los siguientes
periféricos y por la tanto podrás emplear sus interrupciones asociadas:

 Interrupción externa por la patilla RB0/INT.


 Interrupción por desbordamiento de los temporizadores Timer 0, Timer 1 y Timer 2.
 Interrupción por cambio de estado en cualquiera de las patillas de la Puerta B que estén
configuradas como entradas y debidamente habilitadas.
 Interrupción al finalizar un ciclo de escritura sobre la memoria EEPROM de datos.
 Interrupción cuando el circuito de monitorización del reloj (FSCM) detecta un fallo en el
reloj del sistema.
 Interrupción mediante el wake-up (“despertar”) por RA0 de muy bajo consumo.

De todas formas lo que aprendas ahora sobre las interrupciones, podrás utilizarlo en un futuro con
estos u otros periféricos de cualquiera de las familias o gamas de controladores PIC.

T-8.2.3 El registro INTCON

Este registro se mantiene prácticamente igual que el de los primeros dispositivos PIC que
aparecieron en el mercado. Contiene los bits de estado (F) y de habilitación de interrupción (E) del
temporizador Timer 0, de la interrupción externa por RB0/INT y de la interrupción por cambio de estado en
las patillas RB0:RB7. También permite establecer el permiso de interrupción para el resto de los periféricos
disponibles en el controlador (PEIE), así como el permiso global para todas ellas (GIE). Si lo analizas junto
con el esquema anterior, podrás entender mejor el mecanismo de las interrupciones. Se muestra a
continuación.

NOMBRE: INTCON (Registro de control de interrupciones) DIR.: 0x0B BANCO:


Todos
R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-x
GIE PEIE T0IE INTE RBIE TOIF INTF RBIF

Bit 7 GIE: Permiso global de interrupciones


1 = Admite aquellas interrupciones que, individualmente, estén habilitadas
0 = No admite ninguna interrupción
Bit 6 PEIE: Permiso de interrupción para el resto de periféricos
1 = Admite aquellas interrupciones del resto de periféricos que estén habilitadas
0 = No admite ninguna interrupción procedente del resto de los periféricos
Bit 5 T0IE: Habilitación de la interrupción del temporizador Timer 0 cuando se
desborde
1 = Permite la interrupción del Timer 0
0 = No permite la interrupción del Timer 0
Bit 4 INTE: Habilitación de la interrupción externa por la patilla RB0/INT
1 = Permite la interrupción externa
0 = No permite la interrupción externa
Bit 3 RBIE: Habilitación de interrupción por cambio de estado en cualquiera de
las líneas RB0:RB7 (1)
1 = Permite la interrupción por cambio de estado
0 = No permite la interrupción por cambio de estado
Bit 2 T0IF: Bit de estado del temporizador Timer 0 (2)
1 = El Timer 0 se ha desbordado (debe borrarse por software)
0 = El Timer 0 no se ha desbordado
Bit 1 INTF: Bit de estado de la interrupción externa por RB0/INT
1 = Se ha recibido señal de interrupción por RB0/INT (debe borrarse por

8-11
www.mkelectronica.com Microcontroladores PIC: Nivel I
software)
0 = No se ha recibido señal de interrupción externa
Bit 0 RBIF: Bit de estado de las interrupciones por cambio de estado
1 = Se ha detectado un cambio de estado en las líneas RB0:RB7 (debe borrarse
por software)
0 = No se ha detectado ningún cambio de estado

NOTAS:

1. La habilitación individual de interrupción por cambio de estado para cada una de las líneas
RB0:RB7 de la puerta B, se debe realizar mediante el registro IOCB que se presentó en el apartado
T-5.3.2.3 de la Unidad 5.

2. El bit de estado T0IF se activa cada vez que el Timer 0 se desborde y pase a valer 0x00. Durante la
secuencia de RESET, este temporizador no se modifica, por lo que deberá inicializarse antes de
borrar este bit.

T-8.2.4 Los registros PIR1 y PIE1

El primero de ellos, el PIR1, refleja el estado actual de parte de los periféricos restantes disponibles
en el controlador. Se han resaltado los bits que afectan a aquellos periféricos que se estudian en este curso:

 El convertidor ADC
 El USART
 El módulo CCP1
 Los temporizadores Timer 1 y Timer 2
 El módulo SSP para las comunicaciones serie síncronas.

NOMBRE: PIR1 (Registro de estado de los periféricos nº 1) DIR.: 0x0C BANCO: 0


U-0 R/W-0 R-0 R-0 R/W-0 R/W-0 R/W-0 R/W-0
---- ADIF RCIF TXIF SSPIF CCP1IF TMR2IF TMR1IF

Bit 7 No está implementado. Se lee a “0”


Bit 6 ADIF: Bit de estado del conversor AD
1 = Ha finalizado una conversión AD (debe borrarse por software)
0 = La conversión no ha finalizado o no se ha iniciado
Bit 5 RCIF: Bit de estado del receptor del USART
1 = El buffer de recepción está completo, se ha recibido un carácter (se borra al leerlo
desde el registro RCREG)
0 = El buffer de recepción no está completo
Bit 4 TXIF: Bit de estado del transmisor del USART
1 = El buffer de transmisión está vacío, se ha transmitido un carácter (se borra al escribir
un nuevo carácter en el registro TXREG)
0 = El buffer de transmisión no está vacío
Bit 3 SSPIF: Bit de estado del módulo MSSP de comunicaciones serie síncronas
1 = Se ha producido una condición de interrupción (se debe borrar por software):
Modo SPI
Se ha realizado una transmisión/recepción
Modo I2C Master/Esclavo
Se ha realizado una transmisión/recepción
Modo Master:
Se ha realizado la condición de inicio (start)
Se ha realizado la condición de stop
Se ha realizado la condición de reinicio
Se ha realizado la condición ACK

8-12
www.mkelectronica.com Microcontroladores PIC: Nivel I
0 = No se ha producido ninguna condición de interrupción
Bit 2 CCP1IF: Bit de estado del módulo CCP1
Modo Captura
1 = Se ha capturado el valor del Timer 1 (debe borrarse por software)
0 = No se ha capturado el valor del Timer 1
Modo Comparación
1 = El valor del Timer 1 coincide con el valor del registro de comparación (se
debe borrar por software)
0 = El valor del Timer 1 no coincide con el valor del registro de comparación
Modo PWM
No se usa en este modo
Bit 1 TMR2IF: Bit de estado del Timer 2
1 = El Timer 2 coincide con el contenido del registro de periodos PR2 (debe borrarse por
software)
0 = El Timer 2 no coincide con el registros de periodos PR2
Bit 0 TMR1IF: Bit de estado del Timer 1
1 = El temporizador Timer 1 se ha desbordado (se debe borrar por software)
0 = El temporizador Timer 1 aún no se ha desbordado

Por su parte, el registro PIE1, permite habilitar o no las interrupciones asociadas a cada uno de
ellos. Se han resaltado los bits que afectan a los periféricos estudiados en este curso. Se muestra a
continuación:

NOMBRE: PIE1 (Registro nº 1 para la habilitación de DIR.: 0x8C BANCO: 1


interrupciones)
U-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0
---- ADIE RCIE TXIE SSPIE CCP1IE TMR2IE TMR1IE

Bit 7 No implementado, se lee a “0”


Bit 6 ADIE: Permiso de interrupción del convertidor ADC
1 = Interrupción permitida
0 = Interrupción no permitida
Bit 5 RCIE: Permiso de interrupción en la recepción del USART
1 = Interrupción permitida
0 = Interrupción no permitida
Bit 4 TXIE: Permiso de interrupción en la transmisión del USART
1 = Interrupción permitida
0 = Interrupción no permitida
Bit 3 SSPIE: Permiso de interrupción para el módulo MSSP
1 = Interrupción permitida
0 = Interrupción no permitida
Bit 2 CCP1IE: Permiso de interrupción para el módulo CCP1
1 = Interrupción permitida
0 = Interrupción no permitida
Bit 1 TMR2IE: Permiso de interrupción para el temporizador Timer 2
1 = Interrupción permitida
0 = Interrupción no permitida
Bit 0 TMR1IE: Permiso de interrupción para el temporizador Timer 1
1 = Interrupción permitida
0 = Interrupción no permitida

T-8.2.5 Los registros PIR2 y PIE2

8-13
www.mkelectronica.com Microcontroladores PIC: Nivel I
El primero de ellos, el PIR2, refleja el estado actual de los restantes periféricos disponibles en el
controlador, y que son capaces de provocar una interrupción. Se han resaltado aquellos bits que afectan a
los periféricos estudiados en este curso:

 Circuito de detección de fallos en el oscilador.


 Circuitos comparadores.
 Estado del ciclo de escritura sobre la memoria EEPROM de datos.
 Detección de colisión en el bus I2C.
 Detección de la interrupción de bajo consumo por RA0/ULPWU.
 Estado del módulo CCP2 para la captura, comparación y modulación PWM

NOMBRE: PIR2 (Registro de estado de los periféricos nº 2) DIR.: 0x0D BANCO: 0


R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 U-0 R/W-0
OSFIF C2IF C1IF EEIF BCLIF ULPWUIF ---- CCP2IF

Bit 7 OSCIF: Bit de estado del circuito de detección de fallo en el oscilador del sistema
1 = Fallo en el oscilador externo. INTOSC pasa a ser el nuevo oscilador (se borra
por software)
0 = Oscilador externo en funcionamiento
Bit 6 C2IF: Bit de estado del comparador Nº 2
1 = La salida del comparador 2 ha cambiado (se borra por software)
0 = No hay cambio en la salida del comparador Nº 2
Bit 5 C1IF: Bit de estado del comparador Nº 1
1 = La salida del comparador 1 ha cambiado (se borra por software)
0 = No hay cambio en la salida del comparador 1
Bit 4 EEIF: Bit de estado del ciclo de escritura sobre la EEPROM de datos
1 = El ciclo de escritura ha finalizado (se debe borrar por software)
0 = El ciclo de escritura no ha finalizado o no se ha iniciado
Bit 3 BCLIF: Bit de colisión de datos
1 = Se ha producido una colisión de datos en el bus I2C en modo Master
0 = No se ha producido colisión de datos
Bit 2 ULPWUIF: Bit de estado de la interrupción de bajo consumo
1 = Detectado flanco descendente de interrupción por RA0/ULPWU (debe
borrarse por software)
0 = No se ha detectado el flanco por RA0/ULPWU
Bit 1 No implementado, se lee como nivel “0”
Bit 0 CCP2IF: Bit de estado del módulo CCP2
Modo Captura
1 = Se ha capturado el valor del Timer 1 (debe borrarse por software)
0 = No se ha capturado el valor del Timer 1
Modo Comparación
1 = El valor del Timer 1 coincide con el valor del registro de comparación (se
debe borrar por software)
0 = El valor del Timer 1 no coincide
Modo PWM
No se usa en este modo

Por su parte, el registro PIE2 permite habilitar o no las interrupciones asociadas a cada uno de ellos.
Se han resaltado aquellos bits que afectan a los periféricos estudiados en este curso:

NOMBRE: PIE2 (Registro nº 2 para la habilitación de DIR.: 0x8D BANCO: 1


interrupciones)
R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 U-0 R/W-0
OSFIE C2IE C1IE EEIE BCLIE ULPWUIE ---- CCP2IE

8-14
www.mkelectronica.com Microcontroladores PIC: Nivel I
Bit 7 OSFIE: Permiso de interrupción para el circuito de detección de fallos del
oscilador del sistema
1 = Interrupción permitida
0 = Interrupción no permitida
Bit 6 C2IE: Permiso de interrupción del comparador nº 2
1 = Interrupción permitida
0 = Interrupción no permitida
Bit 5 C1IE: Permiso de interrupción del comparador nº 1
1 = Interrupción permitida
0 = Interrupción no permitida
Bit 4 EEIE: Permiso de interrupción al acabar un ciclo de escritura en la EEPROM
de datos
1 = Interrupción permitida
0 = Interrupción no permitida
Bit 3 BCLIE: Permiso de interrupción al detectar colisión de datos en el bus I2C
en modo Master
1 = Interrupción permitida
0 = Interrupción no permitida
Bit 2 ULPWUIE: Permiso de la interrupción de bajo consumo al detectar flanco
descendente en RA0
1 = Interrupción permitida
0 = Interrupción no permitida
Bit 1 No implementado, se lee como nivel “0”
Bit 0 CCP2IE: Permiso de interrupción del módulo CCP2
1 = Interrupción permitida
0 = Interrupción no permitida

T-8.2.6 Salvando el contexto durante las interrupciones

Para que uno o varios periféricos puedan provocar una interrupción es necesario que se cumplan
tres condiciones:

1. Que estén activados los bits GIE y PEIE del registro INTCON, para la habilitación global
y la habilitación de los periféricos en general respectivamente.
2. Que mediante los registros PIE1 y PIE2 se habiliten las interrupciones en particular de
los periféricos deseados.
3. Que el/los periféricos en cuestión soliciten la interrupción cuando sucedan los
correspondientes eventos.

Cada vez que ocurre una interrupción se produce la siguiente secuencia:

1. Se termina de ejecutar la instrucción en curso del programa principal.


2. El bit GIE se desconecta automáticamente para evitar una nueva interrupción dentro de
la primera.
3. En la memoria stack se guarda automáticamente la posición del PC que apuntará a la
siguiente instrucción del programa principal.
4. El PC se carga con la dirección 0x0004 del vector de interrupción. Como programadores
que somos, es aquí donde pondremos una instrucción “GOTO” de salto a la dirección
donde comienza nuestro programa de tratamiento de interrupciones.
5. Normalmente el programa de tratamiento debe comenzar salvando el contexto actual y
analizando los registros PIR1 y PIR2. Así podemos averiguar qué periférico es el
causante de la interrupción y actuar en consecuencia, ejecutando el programa de
tratamiento correspondiente a ese periférico.

Toda interrupción debe finalizar recuperando el contexto salvado previamente, y ejecutando la


instrucción “RETFIE” de retorno. Ésta se colocará al final del programa de tratamiento correspondiente. Su
ejecución implica:

8-15
www.mkelectronica.com Microcontroladores PIC: Nivel I
1. Reactivar automáticamente el bit GIE, lo que da permiso a nuevas interrupciones.
2. Recuperar desde la memoria de stack el valor del PC.
3. Con ello, se reanuda la ejecución del programa principal desde el punto en donde se dejó.
Se entiende por “salvar/recuperar el contexto” al hecho de salvar aquellos parámetros y/o registros
que vayan a ser modificados por el programa de tratamiento, y que luego necesitamos recuperarlos cuando
se retorne al programa principal, dejándolos como estaban.

Es difícil valorar qué registros se deben salvar. Depende mucho del enfoque que dé el programador
a cada aplicación. Por lo general, los dos registros más importantes que, seguro se emplean durante todo
tratamiento y que desearás recuperar son: el registro W de trabajo y el registro STATUS de estado. La
siguiente secuencia de instrucciones permite salvarlos y la debes incluir al principio del programa de
tratamiento:

movwf W_Temp ;Salva el registro W en una variable temporal


swapf STATUS,W ;Intercambia y salva el registro STATUS sobre el W
movwf STATUS_Temp ;Salva el registro W en otra variable temporal

Ahora comenzaría el programa de tratamiento. Al finalizar el mismo, justo antes de la instrucción


“RETFIE” de retorno, emplearás la siguiente secuencia para recuperar el contexto anteriormente salvado:

swapf STATUS_Temp,W
movwf STATUS ;Recupera el registro STATUS
swapf W_Temp,F
swapf W_Temp,W ;Recupera el registro W

T-8.2.7 Ahora tú

Mediante una serie de ejercicios se trata de que configures los distintos registros implicados para
activar interrupciones producidas por diferentes sucesos o eventos. Modifica únicamente los bits que se
vean implicados en cada registro, el resto los dejas con sus valores por defecto tras el RESET.

Ejercicio 1

Habilita la interrupción que provoca el Timer 0 cada vez que se desborda.

NOMBRE: INTCON (Registro de control de interrupciones) DIR.: 0x0B BANCO:


Todos
GIE PEIE T0IE INTE RBIE TOIF INTF RBIF

Ejercicio 2

Las patillas RB0, RB2 y RB5 actuan como entradas digitales, el resto como salidas digitales. Activar
la interrupción cuando se produzca un cambio de estado en cualquiera de ellas.

a) Configurar entradas/salidas digitales

Nombre: ANSELH (Selec. Dirección: 0x189 Banco: 3


analógica)
---- ---- ANS13 ANS12 ANS11 ANS10 ANS9 ANS8

b) Configurar entradas y salidas

Nombre: TRISB (Configuración de B) Dirección: 0x86 Banco: 1

8-16
www.mkelectronica.com Microcontroladores PIC: Nivel I
TRISB7 TRISB6 TRISB5 TRISB4 TRISB3 TRISB2 TRISB1 TRISB0

c) Habilitar individualmente a cada patilla para la interrupción por cambio de estado

Nombre: IOCB (Int. Por cambio) Dirección: 0x96 Banco: 1


IOCB7 IOCB6 IOCB5 IOCB4 IOCB3 IOCB2 IOCB1 IOCB0

d) Habilitación general de interrupciones

NOMBRE: INTCON (Registro de control de interrupciones) DIR.: 0x0B BANCO:


Todos
GIE PEIE T0IE INTE RBIE TOIF INTF RBIF

Ejercicio 3

Activar la interrupción externa cada vez que se detecte un flanco descendente por la patilla
RB0/INT, y la interrupción que produce el Timer 1 cuando se desborda.

a) Selección del flanco activo para la interrupción externa

Nombre: OPTION_REG Dirección: 0x01 Bancos: 1 y 3


/RBU INTEDG T0CS T0SE PSA PSA2 PSA1 PSA0

b) Habilitación de la interrupción del Timer 1

NOMBRE: PIE1 (Registro nº 1 para la habilitación de DIR.: 0x8C BANCO: 1


interrupciones)
---- ADIE RCIE TXIE SSPIE CCP1IE TMR2IE TMR1IE

c) Habilitación de la interrupción externa por RB0/INT y permisos generales

NOMBRE: INTCON (Registro de control de interrupciones) DIR.: 0x0B BANCO:


Todos
GIE PEIE T0IE INTE RBIE TOIF INTF RBIF

Ejercicio 4

Activar la interrupción para el caso de que se detecte un fallo en el oscilador externo (FCSM)

a) Habilitación de la interrupción del circuito de monitorización del reloj (FCSM)

NOMBRE: PIE2 (Registro nº 2 para la habilitación de DIR.: 0x8D BANCO: 1


interrupciones)
OSFIE C2IE C1IE EEIE BCLIE ULPWUIE ---- CCP2IE

b) Permisos generales

8-17
www.mkelectronica.com Microcontroladores PIC: Nivel I
NOMBRE: INTCON (Registro de control de interrupciones) DIR.: 0x0B BANCO:
Todos
GIE PEIE T0IE INTE RBIE TOIF INTF RBIF

8-18
www.mkelectronica.com Microcontroladores PIC: Nivel I
AREA DE PRÁCTICAS

P-8.1 EJEMPLO 8-1: Interrupción externa RB0/INT y el modo SLEEP

Con este ejemplo vas a tener una primera toma de


contacto con las interrupciones. En este caso emplearás la
llamada interrupción externa que la puede provocar cualquier
periférico conectado a la patilla RB0/INT.

Se emplea el pulsador E4 del laboratorio como periférico


de entrada que provoca una interrupción externa sensible al flanco
descendente. El programa de tratamiento de la interrupción se
limita, en este ejemplo, a activar durante 1 segundo la salida RB3
que se conectará con el led S0.

P-8.1.1 Descripción / Edición del programa fuente

En la secuencia de inicio, tras el RESET, se inician los registros internos como siempre. Mención
especial se merece el empleo del registro OPTION. Configura la interrupción externa RB0/INT sensible al
flanco descendente. También se emplea el registro INTCON para habilitar la interrupción externa (bit INTE)
y dar permiso global de interrupciones (bit GIE).

El cuerpo del programa principal está compuesto por la instrucción “sleep” que detiene al
controlador dejándolo en el modo standby de bajo consumo. Este estado se mantiene hasta que se detecte
una interrupción. En este instante el controlador “despierta” y ejecuta el programa de tratamiento. Al final del
mismo, retorna y ejecuta la instrucción “nop” del programa principal y la instrucción “goto Loop”, que vuelve
a colocarlo en el modo stanby hasta la siguiente interrupción.

Por su parte, el programa de tratamiento se inicia en la dirección 0x0004 del vector de interrupción.
Aquí se ejecuta la instrucción “goto Interrupción” donde realmente comienza. Se activa la salida RB3, se
temporiza 1 segundo y luego se desactiva. El tratamiento finaliza mediante la instrucción “bcf
INTCON,INTF” que borra y repone el bit de interrupción para esperar a la siguiente, y con la instrucción
“retfie”, que devuelve el control al programa principal.

P-8.1.2 Montaje eléctrico E0 S0 RB3

E1 S1

E2 S2
Se corresponde con el esquema mostrado E3 S3
en la figura. El pulsador E4 del laboratorio se E4 RB0 S4
conecta con la entrada de interrupción externa por
E5 S5
la línea RB0/INT. El led de salida S0 se conecta con
E6 S6
la patilla RB3 que actúa como salida.
E7 S7

E. DIGITALES
SALIDAS DIGITALES

P-8.1.3 Grabación del dispositivo y comprobaciones finales

Recuerda, si vas a hacer depuración, coloca el conmutador del laboratorio en la posición USB y
selecciona en el MPLAB-IDE la herramienta de depuración mediante Debugger  Select Tool  PICkit2.
Con el botón Program the target device transfieres al PIC el programa que acabas de ensamblar y que vas
a depurar y/o ejecutar. También es interesante que pulses el botón Reset para asegurar el inicio de la
ejecución desde el principio. Crea tu entorno de trabajo y utiliza las herramientas disponibles que ya
conoces (ejecución paso a paso, breakpoints y ejecución en tiempo real).

8-19
www.mkelectronica.com Microcontroladores PIC: Nivel I
Luego procede a grabar el dispositivo deshabilitando el depurador mediante Debugger  Select
Tool  None y habilitando el grabador mediante Programmer  Select Programmer  PICkit 2.

¡No te olvides de hacer el proceso inverso cuando necesites nuevamente del depurador!

Mediante el botón Program the target device graba el programa en la memoria flash del
controlador.

Comprueba que cada vez que accionas el pulsador E4 la salida RB3 se mantiene activada durante
1 segundo y luego se desactiva.

P-8.1.4 Ahora tú

La importancia del ejemplo radica en el empleo, por vez primera, de las interrupciones. En este caso
es un periférico externo, el pulsador E4, quien solicita la atención del controlador para realizar una
determinada tarea. Esto abre un gran número de posibilidades, aplicaciones y proyectos.

Fíjate en dos importantes conceptos y trata de interiorizar lo que esto supone de cara a tus propios
proyectos:

1. En el ejemplo se utiliza la instrucción SLEEP para detener al controlador y dejarlo en el modo de


muy bajo consumo del que sólo despierta cuando externamente se solicita su atención. Un evidente
caso de ahorro de energía.

2. En otras aplicaciones el controlador puede estar realizando otras tareas y únicamente atenderá al
periférico cuando éste lo solicite mediante la correspondiente interrupción, luego reanudará su
trabajo donde lo dejó.

P-8-2 EJEMPLO 8-2: Interrupción por cambio de estado

Otro tipo de interrupción externa es la que se puede provocar cuando cualquier patilla de entrada de
la puerta B cambia de estado lógico (de nivel “0” pasa a “1” o viceversa). A diferencia de otros
controladores, en el caso de los PIC16F88X, cualquiera de las líneas RB0:RB7 puede tener esta capacidad
de interrupción.

En el ejemplo se utilizan las señales RB0:RB2 conectadas con los interruptores E0:E2 que actúan
como periféricos de entrada. Cuando cualquiera de ellos cambia de nivel lógico, se provoca una interrupción
cuyo tratamiento consiste en activar, durante un segundo, cualquiera de las salidas RA0:RA2 conectadas a
los leds S0:S2 del laboratorio. Por ejemplo, si RB1 cambia de estado, se activa la salida RA1 durante 1
segundo. De forma similar se procede con el resto de las entradas.

P-8.2.1 Descripción / Edición del programa fuente

En la secuencia de inicio, tras el RESET, se inician los registros internos como siempre. En este
caso las líneas RB0:RB2 se configuran como entradas y RA0:RA2 como salidas. Vas a emplear por vez
primera el registro IOCB, el que estudiaste en la Unidad 5. Con él puedes determinar qué líneas de entrada
de la puerta B, van a tener la capacidad de interrumpir al cambiar de estado. En este ejemplo serán las
líneas RB0:RB2.

La secuencia de inicio finaliza leyendo y registrando el estado actual de las entradas de la puerta B
y habilitando las interrupciones. Mediante el registro INTCON se habilita la interrupción por cambio de
estado (bit RBIE), y se da permiso global de interrupciones (bit GIE).

El cuerpo del programa principal está compuesto por la instrucción “sleep” que detiene al
controlador, dejándolo en el modo standby de bajo consumo. Este estado se mantiene hasta que se detecte
una interrupción. En este instante el controlador “despierta” y ejecuta el programa de tratamiento. Al final del

8-20
www.mkelectronica.com Microcontroladores PIC: Nivel I
mismo, retorna y ejecuta la instrucción “nop” del programa principal y la instrucción “goto Loop”, que vuelve
a colocarlo en el modo stanby hasta la siguiente interrupción.

Por su parte, el programa de tratamiento se inicia en la dirección 0x0004 correspondiente al vector


de interrupción. Aquí se ejecuta la instrucción “goto Interrupción” donde empieza realmente. Comienza
haciendo una temporización de unos 40 mS para evitar los rebotes de los interruptores. A continuación
actualiza el nuevo valor de las entradas y determina cuál ha sido la que ha cambiado, para activar así la
salida correspondiente durante 1 segundo. El tratamiento finaliza borrando y reponiendo el bit de
interrupción mediante la instrucción “bcf INTCON,RBIF”, y ejecutando la instrucción “retfie” que devuelve el
control al programa principal.

P-8.2.2 Montaje eléctrico

E0 RB0 S0 RA0

E1 RB1 S1 RA1
Se corresponde con el esquema mostrado en la
E2 RB2 S2 RA2 figura de la izquierda. Los interruptores E0:E2 se
E3 S3 conectan con las entradas RB0:RB2 y provocarán
E4 S4 interrupción cuando en cualquiera de ellos se
E5 S5 produzca un cambio de estado. Las líneas RA0:RA2
E6 S6
actuarán ahora como salidas y se conectarán con los
leds S0:S2 del laboratorio.
E7 S7

E. DIGITALES
SALIDAS DIGITALES

P-8.2.3 Grabación del dispositivo y comprobaciones finales

Si vas a hacer depuración, coloca el conmutador del laboratorio en la posición USB y selecciona en
el MPLAB-IDE la herramienta de depuración mediante Debugger  Select Tool  PICkit2. Con el botón
Program the target device transfieres al PIC el programa que acabas de ensamblar y que vas a depurar
y/o ejecutar. También es interesante que pulses el botón Reset para asegurar el inicio de la ejecución
desde el principio. Crea tu propio entorno de trabajo y utiliza las herramientas disponibles (ejecución paso a
paso, breakpoints y ejecución en tiempo real).

A continuación debes proceder a grabar el PIC deshabilitando el depurador mediante Debugger 


Select Tool  None y luego habilitando el grabador mediante Programmer  Select Programmer 
PICkit 2. Mediante el botón Program the target device graba el programa en la memoria flash del
controlador.

Cada vez que cualquiera de los interruptores de entrada E0:E2 cambie de estado, pasando de nivel
“0” a nivel “1” o viceversa, la salida correspondiente se activará durante 1 segundo. Compruébalo.

P-8.2.4 Ahora tú

Debes considerar que la posibilidad de interrupciones por cambio de estado amplía


considerablemente el número de interrupciones externas. Efectivamente, cualquiera de las patillas RB0:RB7
de la puerta B se pueden configurar con esta capacidad, lo que brinda la posibilidad de conectar otros
tantos periféricos que quieran solicitar la atención del controlador. Basta con leer la puerta B para averiguar
cuál de ellos ha sido y ejecutar el tratamiento que le corresponda.

Nuevamente debes fijarte en los dos mismos e importantes conceptos, y tratar de interiorizar lo que
esto supone de cara a tus propios proyectos:

8-21
www.mkelectronica.com Microcontroladores PIC: Nivel I
1. En el ejemplo se utiliza la instrucción SLEEP para detener al controlador y dejarlo en el modo de
muy bajo consumo, del que sólo despierta cuando externamente se solicita su atención. Un nuevo
caso de ahorro de energía.

2. En otras aplicaciones el controlador puede estar realizando otras tareas y únicamente atenderá al
periférico cuando éste lo solicite mediante la correspondiente interrupción, luego reanudará su
trabajo donde lo dejó.

P-8-3 EJEMPLO 8-3: Control del teclado mediante interrupción por cambio de estado

En alguno de los ejemplos de la Unidad 6 hiciste uso de la rutina “Key_Scan”, que permitía explorar
el teclado de 4x4 del laboratorio USB-PIC’School. Tras hacer una exploración, devolvía un código que
indicaba qué tecla se había pulsado, o bien que no se había pulsado ninguna.

Aquí tienes aplicación práctica y real de las interrupciones por cambio de estado: el control de un
teclado. Vas ejecutar la misma rutina “Key_Scan”, pero SOLO cuando pulses una tecla. Efectivamente, el
controlador se puede encontrar bien en el modo SLEEP de bajo consumo, o bien ejecutando una
determinada tarea. Cuando se pulsa cualquier tecla, alguna línea de entrada cambiará de estado. Esto
provocará una interrupción cuyo tratamiento ejecutará la rutina “Key_Scan”, que devolverá el código de la
tecla pulsada.

En este ejemplo, el teclado se controla desde las líneas de la puerta B que, precisamente, son las
que tienen la facultad de detectar y producir este tipo de interrupción. La tecla pulsada se visualiza sobre la
pantalla LCD del mismo laboratorio.

P-8.3.1 Descripción / Edición del programa fuente

En la secuencia de inicio, tras el RESET, se activan las cargas o resistencias pull-up asociadas a
todas las líneas de la puerta B que sean configuradas como entradas. Para ello, se carga el valor binario
b’11110000’ en el registro WPUB con lo que las cargas asociadas a RB7:RB4 quedan habilitadas, y se
ejecuta la instrucción “bcf OPTION_REG,NOT_RBPU” para activarlas. De esta forma se consigue que esas
líneas, en reposo, se mantengan a nivel “1”. Mediante el registro IOCB también se dota a las patillas
RB7:RB4 de la capacidad de interrupción por cambio de estado. Estas líneas se conectan precisamente a
las filas del teclado matricial.

Seguidamente, se habilita la pantalla LCD por donde se visualiza el mensaje "Has pulsado : ". Las
líneas RB7:RB4 se configuran como entradas desde las filas del teclado. En reposo, están a nivel “1”
gracias a las resistencias pull-up. Las líneas RB3:RB0 se configuran como salidas desde las columnas del
teclado. Inicialmente, en reposo, se encuentran a nivel “0”.

Por último, se habilita la interrupción activando los bits RBIE y GIE del registro INTCON. A partir de
este momento, una pulsación de cualquier tecla, implica que una de las líneas de entrada RB7:RB4 cambie
de estado y se provoque la interrupción.

El cuerpo del programa principal está compuesto por la instrucción “sleep”, que detiene al
controlador dejándolo en el modo standby de bajo consumo. Este estado se mantiene hasta que se detecte
una interrupción. En este instante el controlador “despierta” y ejecuta el programa de tratamiento. Al final del
mismo, retorna y ejecuta la instrucción “nop” del programa principal y la instrucción “goto Loop” que vuelve
a colocarlo en el modo standby hasta la siguiente interrupción.

Por su parte, el programa de tratamiento se inicia en la dirección 0x0004 del vector de interrupción.
Aquí se ejecuta la instrucción “goto Interrupción” donde comienza realmente. Se ejecuta la rutina
“Key_Scan”, el código de la tecla pulsada se convierte a código ASCII, se visualiza en la pantalla LCD y se
rearma de nuevo el sistema para aceptar una nueva pulsación/interrupción.

8-22
www.mkelectronica.com Microcontroladores PIC: Nivel I
P-8.3.2 Montaje eléctrico
PANTALLA LCD

Se muestra en la siguiente figura.


2X16
Las columnas C0:C3 del teclado se conectan
con las líneas RB0:RB3 que actuarán como

R/W
RS

D0
D1
D2
D3
D4
D5
D6
D7
E
8
salidas. Las filas F0:F3 se conectan con las 7 F3
F2 1 2 3 ^

4
5
6

7
8
9
10
11
12
13
14
6
líneas RB4:RB7 que actúan como entradas 5 F1
F0
con resistencias pull-up internas. Por su 4 4 5 6
^
3 C3
C2
parte la transferencia de datos con la 2
C1
pantalla LCD se realiza mediante RB0:RB3 y
1
C0 7 8 9 >
se controla con las salidas RA1:RA3 que se * 0 # <
conectan con las señales E, R/W y RS
respectivamente. TECLADO4X4

RB0
RA3
RA2
RA1

RB1
RB2
RB3
RB4
RB5
RB6
RB7
P-8.3.3 Grabación del dispositivo y comprobaciones finales

Una vez que hayas realizado la fase de depuración del programa, procede a grabarlo sobre el
controlador para comprobar su correcto y definitivo funcionamiento. Todo esto ya lo has venido haciendo
con todos los ejemplos anteriores. La comprobación de este ejemplo es muy sencilla. Basta con ir pulsando
diferentes teclas que se irán visualizando sobre la pantalla LCD.

Como ya se ha repetido anteriormente, las posibilidades son


numerosas. Basta con que te imagines un mando a distancia, (p.e. el
de un TV). Su controlador, normalmente estará en el modo SLEEP de
muy bajo consumo, de ahí la larga duración de las pilas que lo
alimentan. El controlador únicamente reacciona cuando se pulsa
cualquier tecla.

En otros casos, el controlador puede estar realizando un determinado trabajo que será interrumpido
únicamente cuando se pulse una tecla. Es decir, el controlador sólo tiene que preocuparse del teclado
cuando se detecte una pulsación.

P-8-4 EJEMPLO 8-4: La memoria EEPROM y la máquina “Su Turno”

Vas a tener una primera toma de contacto con la memoria EEPROM de datos, sobre la que se va a
almacenar información no volátil pero sí modificable. Para ello realizarás un ejemplo que te puede servir
como base para una aplicación real.

Seguro que has visto alguna vez, en un supermercado, la


clásica máquina que informa al cliente del número de turno que le
corresponde para ser atendido. Esto es lo que vas a tratar de
emular con este ejemplo. Mediante el pulsador E4 conectado con la
entrada RA0, el operario hace avanzar al siguiente turno cada vez
que termina de atender a un cliente. Mediante los displays del
laboratorio se visualizará en todo momento el turno actual.

En el fondo se trata de hacer un contador ascendente


parecido al que hiciste en la Unidad 6. Sin embargo, la aportación
de este ejemplo consiste en el empleo de la memoria EEPROM,
donde se registrará en todo momento el número del turno actual. De esta manera, si se produce un fallo de
alimentación, cuando se reponga nuevamente, los displays recuperarán y mostrarán automáticamente el
último turno antes del fallo. Evitamos así que el operario deba recordar y avanzar hasta el número en que se
encontraba. Esto mismo serviría para recordar el turno de un día para otro.

8-23
www.mkelectronica.com Microcontroladores PIC: Nivel I
P-8.4.1 Descripción / Edición del programa fuente

En el programa fuente tienes una nueva directiva, “de 0x01”, detrás de “org 0x2100”. Con ella se
genera la información necesaria en el fichero ejecutable *.HEX para que, en fase de grabación del
controlador, el valor 0x01 (o cualquier otro) se escriba sobre la dirección 0x2100, que no es otra que la
primera posición de la memoria EEPROM de datos. En otras palabras, cuando compiles este programa y lo
grabes en el PIC, la posición 0x00 de la memoria EEPROM tendrá el valor 0x01. Es el primer número del
turno.

Tras la secuencia de RESET, cuando el PIC ejecuta el programa, lo primero que se hace es leer la
posición 0x00 de la EEPROM. Si contiene el valor 0x01 es porque el sistema se emplea por primera vez.
Los displays deben visualizar el turno 01 inicial. A partir de aquí comienza la cuenta.

Cada vez que el tendero acciona el pulsador con una transición completa, (activar-desactivar), el
contador de turno se incrementa en una unidad, se visualiza sobre los displays y se guarda en la EEPROM
como nuevo turno. El contador siempre evoluciona llevando la cuenta en decimal.

En el programa principal hay que destacar dos subrutinas relacionadas con la gestión de la memoria
EEPROM de datos. La rutina EE_Read ejecuta un ciclo de lectura. El registro EEADR debe contener la
dirección a leer (0x00 en este ejemplo) y en el registro EEDAT obtendremos el dato leído, (en este caso el
número del turno). La rutina EE_Write ejecuta un ciclo de escritura sobre la EEPROM de datos, tal y como
se explicó en el área de teoría. El registro EEADR debe cargarse con la dirección (0x00 en este ejemplo), y
el EEDAT con el dato a grabar (el nuevo turno).

El resto de rutinas ya son más o menos conocidas ya que las has empleado en algunos ejemplos de
la Unidad 6 anterior (Tabla, Visu_Disp, etc.).

P-8.4.2 Montaje eléctrico

7 SEGMENTOS Se muestra en la figura. El pulsador


E0
a RB0 E4 se conecta con la entrada RA0 y
b RB1
c RB2
E1 es utilizado por el vendedor para
RB3
d
e RB4
E2 avanzar el turno en una unidad cada
f RB5 E3 vez que lo acciona. La pareja de
g RB6
dp RB7 E4 RA0 displays se controlan desde las
AC DEC AC UNI E5
líneas RB0:RB7 que gobiernan los
.

segmentos. RA2 controla el display


E6
de las unidades y RA3 el de las
RA2 E7
RA3
decenas.
E. DIGITALES

P-8.4.3 Grabación del dispositivo y comprobaciones finales

Una vez que hayas realizado la fase de depuración del programa, procede a grabarlo sobre el
controlador para comprobar su correcto y definitivo funcionamiento. Todo esto ya lo has venido haciendo
con todos los ejemplos anteriores.

Cuando se ejecuta la aplicación por vez primera, la posición 0x00 de la EEPROM debe contener el
valor 0x01. Los displays deben visualizar el número 01. A medida que acciones el pulsador la cuenta se
incrementa en una unidad.

Debes probar a apagar el sistema y volverlo a encender. Comprueba que los displays visualizan el
último número de la cuenta.

8-24
www.mkelectronica.com Microcontroladores PIC: Nivel I
P-8.4.4 Ahora tú

Te propongo un proyecto de cierta envergadura para que trates de resolverlo. Imagina una oficina
de información al público donde, mediante 4 ventanillas, otros tantos operarios atienden a sus
correspondientes clientes. Sugiero realizar un sistema para el control de 4 turnos distintos. Para ello puedes
utilizar la pantalla LCD del laboratorio USB-PIC’School que tiene una mayor capacidad de visualización.

P-8-5 EJEMPLO 8-5: La memoria EEPROM, control de accesos

Este es el último ejemplo de la Unidad


8. Te puede servir como modelo para realizar
un proyecto o aplicación de carácter real,
como puede ser un control de accesos. Con la
pantalla LCD y el teclado, se realiza un
intuitivo interface de usuario. La pantalla irá
visualizando una serie de mensajes que serán
respondidos mediante el teclado.

La memoria EEPROM contiene el código o clave de acceso. Se trata de un código de 4 dígitos que,
por defecto, es el 1234. El programa permite realizar accesos, cambios de clave, confirmaciones, etc., y
controla dos salidas. El led S0 conectado con la salida RA4 simula el relé o bobina que permite la apertura
de la puerta. El led S7 conectado con la salida RA5 simula un altavoz o piezo eléctrico que emite un sonido
o “beep” con cada pulsación en el teclado.

P-8.5.1 Descripción / Edición del programa fuente

El programa fuente puede parecerte grande y complejo. Sin embargo, si lo analizas con cuidado, se
puede comprobar que la mayor parte de las rutinas ya las has empleado en los diferentes ejemplos hechos
hasta ahora. Cabe destacar algunas rutinas propias de esta aplicación:

 Key_off: Esta rutina se emplea justo tras detectar la pulsación de una tecla. Genera un beep
de 100 mS (simulado con el led S7 del laboratorio) y espera a que se deje de pulsar esa
tecla.

 Control: Espera que se tecleen los cuatro dígitos de la clave, los almacena en digito_1:
digito_4 y visualiza **** en LCD. La tecla C (->) permite cancelar en cualquier momento.

 Okey: Comprueba si la clave introducida en el buffer coincide con la de la EEPROM. En caso


afirmativo el bit 0 e la variable “Temporal_1” se pone a "0". De lo contrario dicho bit se pone a
"1".

El resto del programa es bastante secuencial y responde a las necesidades del proyecto.

P-8.5.2 Montaje eléctrico

Es el mostrado en la figura. Tanto el teclado como la pantalla LCD se conectan como lo has venido
haciendo en anteriores ejemplos. Los leds S0 y S7 del laboratorio se conectan con las salidas RA4 y RA5.
Simulan las salidas al relé y al piezo eléctrico respectivamente.

8-25
www.mkelectronica.com Microcontroladores PIC: Nivel I
PANTALLA LCD

S0 RA4
2X16 (RELE)
S1

R/W
RS

D0
D1
D2
D3
D4
D5
D6
D7
S2

E
8
F3
4
7
F2 1 2 3 ^ S3
5
6

7
8
9
10
11
12
13
14
6
5 F1
F0 S4
4 4 5 6
^
3 C3
2 C2 S5
C1
1
C0 7 8 9 > S6

S7 RA5
* 0 # < (BEEP)
SALIDAS DIGITALES
TECLADO4X4
RB0
RA3
RA2
RA1

RB1
RB2
RB3
RB4
RB5
RB6
RB7

P-8.5.3 Grabación del dispositivo y comprobaciones finales

Una vez que hayas realizado la fase de depuración del programa, procede a grabarlo sobre el
controlador para comprobar su correcto y definitivo funcionamiento. Esto ya lo has venido haciendo con
todos los ejemplos anteriores.

La fotografía de la figura muestra un aspecto de la pantalla LCD con algunos de los mensajes
visualizados como parte del interface con el usuario. Para comprobar el funcionamiento basta con seguir
esos mensajes.

La clave por defecto es 1234. Con ella puedes proceder a simular la apertura. También puedes
probar a introducir claves erróneas para observar la respuesta del programa cuando se falla en el tercer
intento.

Analiza también la secuencia que hay que realizar para hacer un cambio de la clave. Te recordará
bastante a la secuencia que haces normalmente para cambiar una clave en, por ejemplo, tu cajero

8-26
www.mkelectronica.com Microcontroladores PIC: Nivel I
automático. Una vez cambiada debes desconectar la alimentación y volverla a conectar. Comprueba ahora
que la apertura se realiza al emplear esa nueva clave.

P-8.5.4 Ahora tú

Se trata probablemente del ejemplo más complejo de todos los que has realizado hasta ahora. Más
que complejo diría que es largo. Si lo estudias con detenimiento verás que algunas rutinas las has
empleado en ejemplos anteriores y las nuevas son bastante claras y explícitas. Pero este estudio nadie lo
puede hacer por ti, sólo tú puedes llevarlo a cabo.

Seguramente el programa pueda hacerse más versátil si mejoras el interface de usuario añadiendo
más mensajes y funciones. Una modificación interesante sería aumentar el número de dígitos de que consta
la clave. A más dígitos mayor seguridad. Queda a tu elección adaptar este programa/proyecto según tus
propios criterios y/o necesidades. Seguro que te sirve de “inspiración” para proyectos más ambiciosos.

8-27
www.mkelectronica.com Microcontroladores PIC: Nivel I
8-28
www.mkelectronica.com Microcontroladores PIC: Nivel I
UNIDAD 9: LOS TEMPORIZADORES O “TIMERS”

OBJETIVOS

Has llegado a la última Unidad de este curso. En ella vamos tratar de los circuitos temporizadores o
“Timers”. No está mal para ser un curso, el nivel I, de introducción a los microcontroladores PIC. Es cierto
que algunos modelos de controladores pueden integrar una más amplia variedad de circuitos para el control
de periféricos como son convertidores ADC, comunicación serie, módulos CCP, comparadores, etc…, pero
lo que has estudiado hasta el momento es común a la mayor parte de ellos y lo mínimo que debes conocer.
A partir de aquí seguro que serás capaz de enfrentarte a otros dispositivos más complejos y con más
recursos internos, bien estudiándolos por tu cuenta o bien en un futuro curso más avanzado, el nivel II.

Es el momento de hablar de los temporizadores. Los dispositivos PIC16F88X integran tres


temporizadores o Timers totalmente independientes entre sí: el Timer 0 (TMR0), el Timer 1 (TMR1) y el
Timer 2 (TMR2). Cualquiera de ellos tiene diferentes formas de trabajo y configuraciones. Es más, alguno
de ellos se usa como apoyo a otros circuitos que integran los PIC. Los podrás usar indistintamente en
múltiples proyectos y aplicaciones.

ÁREA DE TEORÍA

T-9.1 INTRODUCCIÓN
T-9.1.1 Temporizaciones por software
T-9.1.2 Temporizaciones por hardware

T-9.2 EL TIMER 0 (TMR0)


T-9.2.1 El TMR0 en el modo de temporizador
T-9.2.2 El TMR0 en el modo contador
T-9.2.3 El prescaler del TMR0
T-9.2.4 Nuevamente con el registro OPTION
T-9.2.5 Otros registros asociados con el TMR0
T-9.2.6 Cargar el Timer 0
T-9.2.7 Ahora tú

T-9.3 EL TIMER 1 (TMR1)


T-9.3.1 Funcionamiento del TMR1
T-9.3.2 Control de disparo del TMR1
T-9.3.3 La interrupción del TMR1
T-9.3.4 El TMR1 en el modo SLEEP
T-9.3.5 El registro de control T1CON
T-9.3.6 Otros registros asociados con el TMR1
T-9.3.7 Ahora tú

T-9.4 EL TIMER 2 (TMR2)


T-9.4.1 Funcionamiento del TMR2
T-9.4.2 El registro de control T2CON
T-9.4.3 Otros registros asociados con el TMR2
T-9.4.4 Ahora tú

ÁREA DE PRÁCTICAS

P-9.1 EJEMPLO 9-1: Temporización simple con el TMR0


P-9.1.1 Descripción / Edición del programa fuente
P-9.1.2 Montaje eléctrico
P-9.1.3 Grabación del dispositivo y comprobaciones finales

9-1
www.mkelectronica.com Microcontroladores PIC: Nivel I
P-9.1.4 Ahora tú

P-9.2 EJEMPLO 9-2: Interrupción con el TMR0


P-9.2.1 Descripción / Edición del programa fuente
P-9.2.2 Montaje eléctrico
P-9.2.3 Grabación del dispositivo y comprobaciones finales
P-9.2.4 Ahora tú

P-9.3 EJEMPLO 9-3: El TMR0 como contador de eventos externo


P-9.3.1 Descripción / Edición del programa fuente
P-9.3.2 Montaje eléctrico
P-9.3.3 Grabación del dispositivo y comprobaciones finales
P-9.3.4 Ahora tú

P-9.4 EJEMPLO 9-4: Temporización e interrupción con el TMR1


P-9.4.1 Descripción / Edición del programa fuente
P-9.4.2 Montaje eléctrico
P-9.4.3 Grabación del dispositivo y comprobaciones finales
P-9.4.4 Ahora tú

P-9.5 EJEMPLO 9-5: El TMR1 como contador


P-9.5.1 Descripción / Edición del programa fuente
P-9.5.2 Montaje eléctrico
P-9.5.3 Grabación del dispositivo y comprobaciones finales
P-9.5.4 Ahora tú

P-9.6 EJEMPLO 9-6: El TMR1 como contador con control de disparo externo
P-9.6.1 Descripción / Edición del programa fuente
P-9.6.2 Montaje eléctrico
P-9.6.3 Grabación del dispositivo y comprobaciones finales
P-9.6.4 Ahora tú

P-9.7 EJEMPLO 9-7: El TMR1 como divisor de frecuencias


P-9.7.1 Descripción / Edición del programa fuente
P-9.7.2 Montaje eléctrico
P-9.7.3 Grabación del dispositivo y comprobaciones finales
P-9.7.4 Ahora tú

P-9.8 EJEMPLO 9-8: Frecuencímetro


P-9.8.1 Descripción / Edición del programa fuente
P-9.8.2 Montaje eléctrico
P-9.8.3 Grabación del dispositivo y comprobaciones finales
P-9.8.4 Ahora tú

P-9.9 EJEMPLO 9-9: Interrupción periódica con el TMR2


P-9.9.1 Descripción / Edición del programa fuente
P-9.9.2 Montaje eléctrico
P-9.9.3 Grabación del dispositivo y comprobaciones finales
P-9.9.4 Ahora tú

P-9.10 EJEMPLO 9-10: Entretenimiento, “Adivina el número”


P-9.10.1 Descripción / Edición del programa fuente
P-9.10.2 Montaje eléctrico
P-9.10.3 Grabación del dispositivo y comprobaciones finales
P-9.10.4 Ahora tú

9-2
www.mkelectronica.com Microcontroladores PIC: Nivel I
MATERIAL COMPLEMENTARIO

 Guía rápida de referencia


 Ejemplos y librerías de la Unidad 9
 Vídeo Unidad 9
 Soluciones Unidad 8
 Soluciones Unidad 9
 Cuestionario

9-3
www.mkelectronica.com Microcontroladores PIC: Nivel I
9-4
www.mkelectronica.com Microcontroladores PIC: Nivel I
AREA DE TEORÍA

T- 9.1 INTRODUCCIÓN

Te va a resultar difícil encontrar una aplicación basada en microcontroladores, en la que no sea


necesario hacer algún tipo de temporización o ciclo de espera, para proceder a realizar una determinada
acción o tarea. De hecho, si repasas los ejemplos que has realizado hasta el momento, verás que en varias
ocasiones has utilizado la rutina “Delay” de temporización. Sea cual sea el ámbito en el que te muevas, bien
sea en el control industrial, en automatismos, robótica, juegos, etc., seguramente te vas a encontrar con
situaciones como:

 “Esperar” a que llegue una determinada señal.


 Mantener activada una salida durante un “tiempo”.
 “Esperar” un “tiempo” entre una tarea y la
siguiente.
 Medir el “tiempo” transcurrido entre un suceso y
otro.
 Contar el “tiempo” transcurrido para tener una
referencia horaria, etc.

Para realizar estos ciclos de espera tienes dos


alternativas:

1. Emplear rutinas por software cuya ejecución consuma el tiempo deseado. Es lo que has hecho
hasta ahora.

2. Emplear circuitos hardware específicos encargados de realizar la temporización.

T-9.1.1 Temporizaciones por software

Básicamente consiste en hacer que el controlador ejecute un número de instrucciones. Si conoces


la velocidad a la que trabaja y, por tanto, el tiempo que tarda en ejecutar una instrucción, debes calcular
cuántas instrucciones se deben ejecutar para consumir el tiempo total que deseas esperar.

Todos los controladores tienen una instrucción aparentemente inútil, que no hace nada, más que
perder un pequeño intervalo de tiempo. Estamos hablando de la instrucción NOP. Una instrucción NOP tan
sólo consume unos pocos microsegundos, pero si diseñas una rutina con una serie de bucles que la
manden ejecutar miles de veces, puedes conseguir unos lapsus de tiempo de espera tan dilatados como
necesites.

Realmente, éste es el método que has venido empleando en todos los ejemplos prácticos realizados
hasta el momento. Estamos hablando de la rutina “Delay” contenida en la librería “MSE_Delay.inc”. Basta
con que le eches un vistazo para que veas cómo está formada.

T-9.1.2 Temporizaciones por hardware

Es la forma más eficaz para conseguir temporizaciones de gran precisión. Para ello, se emplea un
circuito electrónico diseñado al efecto llamado “Timer”. Consiste básicamente en un contador digital que
puede ser descendente o, como en el caso de los PIC’s, ascendente. El controlador únicamente se limita a
indicarle el valor de la temporización deseada y el propio Timer se encarga de realizarla. Al final de la
misma, el Timer puede avisar al controlador a través, por ejemplo, de una interrupción.

Comentaba que era la forma más eficaz de producir ciclos de espera. Efectivamente, si empleas las
temporizaciones por software, es el controlador el encargado de hacerla. Queda hipotecado y, mientras
tanto, no puede realizar ningún otro trabajo. Si empleas la solución hardware el controlador queda libre para

9-5
www.mkelectronica.com Microcontroladores PIC: Nivel I
hacer lo que sea menester. Será el Timer el
encargado de temporizar y de avisarle cuando finalice.
En la figura se muestra un esquema por bloques de lo
que podría ser una temporización por hardware.
El Timer es un contador que realiza la temporización
en base a una frecuencia patrón que le proporciona
un oscilador o fuente de reloj. El microcontrolador lo
carga con el valor a contar. Cuando termina la
temporización y el contador vale 0, se genera una
señal que se puede emplear para avisar del final de la
misma.

Si se conoce la frecuencia que produce el oscilador,


se dice que el Timer actúa en modo temporizador.
Suponte que el oscilador genera una frecuencia F=1 MHz, a la que le corresponde un periodo T=1 µS. Si a
ese Timer le cargas con el valor 10, cuando llegue a 0 la temporización realizada será de 10 µS.

Un Timer también puede actuar en modo contador. Si le cargas con el valor 10 la cuenta llegará a 0
cuando se le apliquen 10 pulsos externos. El microcontrolador puede leer el Timer en cualquier momento
para conocer el estado actual de la cuenta.

En el mundo de los microcontroladores es difícil encontrar un modelo que no integre algún tipo de
Timer. En el caso de los PIC’s todos tienen al menos uno. Si nos centramos en los dispositivos PIC16F88X
podemos adelantar que disponen de 3 temporizadores:

 El Timer 0 (TMR0) de 8 bits y un prescaler de 8 niveles.


 El Timer 1 (TMR1) de 16 bits y un prescaler de 4 niveles.
 El Timer 2 (TMR2) de 8 bits con un prescaler de 3 niveles y un postcaler de 16.

T-9.2 El TIMER 0 (TMR0)

Es el mismo que se emplea en todos los dispositivos PIC desde el inicio de los tiempos. Se trata de
un temporizador/contador de 8 bits con las siguientes características:

 Se trata de un temporizador/contador ascendente de 8 bits.


 Se encuentra en el área de memoria de datos y se manipula como si de un registro
especial (SFR) se tratara, el TMR0. Lo encontrarás en la dirección 0x01 del banco 0 y en
la 0x101 del banco 2.
 Cada vez que escribes un valor sobre él se inicia una nueva temporización. También lo
puedes leer para conocer el estado actual de la temporización.
 Dispone de un prescaler de 8 niveles que se comparte con el circuito supervisor WDT.
 La fuente de reloj puede seleccionarse entre reloj externo o reloj interno (el del sistema).
 En caso de usar un reloj externo, se puede seleccionar el flanco activo de la señal del
mismo (ascendente o descendente).
 Tiene la posibilidad de interrumpir al controlador cada vez que se desborda y llega a 0
(cuando pasa de 0xFE  0xFF  0x00).

En la figura siguiente se muestra el esquema eléctrico por bloques del circuito del Timer 1 que,
como ya se ha comentado, comparte el prescaler con el supervisor WDT.

T-9.2.1 El TMR0 en modo temporizador

Este modo se selecciona poniendo a nivel “0” el bit T0CS del registro OPTION. El Timer emplea el
reloj interno del sistema y, en caso de no usar el prescaler, se incrementa con cada ciclo de instrucción
(Fosc/4 o bien 4Tosc). Cada vez que se escribe un nuevo valor sobre él, el incremento queda detenido

9-6
www.mkelectronica.com Microcontroladores PIC: Nivel I
durante dos ciclos de instrucción. Debes tener en cuenta este dato si deseas hacer una temporización con
precisión.

T-9.2.2 El TMR0 en el modo contador

Este modo se selecciona cuando se pone a nivel “1” el bit T0CS del registro OPTION. En este caso
la señal de reloj con los pulsos a contar se aplica externamente por la patilla RA4/T0CKI. Mediante el bit
T0SE del mismo registro OPTION se selecciona el tipo de flanco activo de esa señal externa: ascendente o
descendente.

T-9.2.3 El prescaler del TMR0

Dispones de un prescaler de 8 bits que se puede asociar al TMR0 o al supervisor WDT, pero no a
ambos simultáneamente. La asignación a uno u otro se realiza mediante el bit PSA del registro OPTION.
Cuando este bit se pone a nivel “0” el prescaler se asocia al Timer, cuando se pone a “1” se asocia al WDT.

Mediante los bits PS<2:0> del registro OPTION, se selecciona uno de los 8 niveles del prescaler.
Esto permite dividir la cuenta del Timer entre factores de 1:2 a 1:256, con lo que se aumenta así el valor
máximo de temporización.

ó = × (( × )+ )

A partir de aquí puedes calcular qué valor has de cargar en el registro TMR0 para que, conociendo
la frecuencia de trabajo (4Tosc) y el preescaler deseado, se realice una temporización determinada:

ó

=

Ten en cuenta de que el Timer 0 es un temporizador de 8 bits. Si el resultado del cálculo fuera
8
mayor de 256 (2 ), no cabrá en el registro TMR0. Aunque lo ideal es elegir el mínimo prescaler posible, si se
diera el caso anterior deberás elegir un prescaler mayor para que el valor en TMR0 sea menor.

Ejemplo: Trabajando a una frecuencia de 1 MHz (4Tosc=4 µS) realizar una temporización de 5000 µS con
un prescaler de 1:4. Calcular el valor a cargar en el Timer 0:


= =
×

9-7
www.mkelectronica.com Microcontroladores PIC: Nivel I
Como el valor a cargar en el Timer 0 es mayor de 256, habrá que elegir un prescaler mayor, por ejemplo de
1:8. Entonces:


= =
×

Para que te hagas una idea aproximada. Suponiendo una frecuencia de trabajo de 4 MHz con un
periodo (Tosc) de 250 nS, el ciclo de instrucción (4Tosc) es de 1 µS. En la siguiente tabla tienes un resumen
con la temporización mínima y máxima que se puede obtener en función de ciertos valores del prescaler.

V en TMR0 1 255 1 255 1 255 1 255


PRESCALER 1:1 1:1 1:2 1:2 1:128 1:128 1:256 1:256
TEMPORIZA 3 µS 257 µS 4 µS 512 µS 130 µS 32642 µS 258 µS 65282 µS

El prescaler como tal no es un registro que se pueda leer o escribir. Cada vez que escribes un
nuevo valor en el TMR0, el prescaler se reinicia automáticamente (si es que está asociado al TMR0).

T-9.2.4 El Registro OPTION

Entre otras cosas se encarga de configurar el funcionamiento del Timer 0. Ya lo estudiaste en la


Unidad 2, e incluso lo has usado en algún ejemplo anterior, pero ahora lo volvemos a repasar para ver la
incidencia que tiene sobre el Timer 0.

Nombre: OPTION_REG (Registro de Dirección: 0x01 Bancos: 1 y 3


opciones)
R/W-1 R/W-1 R/W-1 R/W-1 R/W-1 R/W-1 R/W-1 R/W-1
/RBU INTEDG T0CS T0SE PSA PSA2 PSA1 PSA0

/RBPU Activación de las resistencias Pull-Up de PORTB


1 = Resistencias Pull-Up deshabilitadas
0 = Resistencias Pull-Up habilitadas
INTEDG Selección del flanco activo de la interrupción externa por la patilla RB0/INT
1 = Interrupción sensible al flanco ascendente
0 = Interrupción sensible al flanco descendente
T0CS Selección de reloj para el Timer 0 (TMR0)
1 = Reloj externo por la patilla RA4/T0CKI
0 = Reloj interno del sistema (Fosc/4)
T0SE Selección del flanco activo del reloj externo para el TMR0
1 = El TMR0 evoluciona con cada flanco descendente por la patilla RA4/T0CKI
0 = El TMR0 evoluciona con cada flanco ascendente por la patilla RA4/T0CKI
PSA Asignación del prescaler
1 = El prescaler se asigna al supervisor Watch Dog (WDT), prescaler 1:1 para el TMR0
0 = El prescaler se asigna al Timer 0 (TMR0)
PS<2:0> Selección del valor del prescaler
000 = 1:2 si es para el TMR0; 1:1 si es para WDT
001 = 1:4 si es para el TMR0; 1:2 si es para WDT
010 = 1:8 si es para el TMR0; 1:4 si es para WDT
011 = 1:16 si es para el TMR0; 1:8 si es para WDT
100 = 1:32 si es para el TMR0; 1:16 si es para WDT
101 = 1:64 si es para el TMR0; 1:32 si es para WDT
110 = 1:128 si es para el TMR0; 1:64 si es para WDT
111 = 1:256 si es para el TMR0; 1:128 si es para WDT

9-8
www.mkelectronica.com Microcontroladores PIC: Nivel I
T-9.2.5 Otros registros asociados con el Timer 0

En la tabla de la figura, extraída del Data Sheet de Microchip, se muestran los registros y bits que,
de alguna manera, tienen relación con el Timer 0. Los bits sombreados no se usan con este Timer.

Los bits del registro INTCON tienen que ver con la facultad que tiene el Timer 0 de provocar
interrupción si se habilitan. Repasa la Unidad anterior. En cualquier caso, el bit T0IF se activa cada vez que
el Timer 0 se desborde y pase a valer 0. Con los bits del registro OPTION se selecciona el tipo de reloj y el
nivel del prescaler. Por último, el bit TRISA4 del registro TRISA se debe configurar como entrada si se
emplea a la línea RA4/T0CKI como entrada de reloj externo.

T-9.2.6 Cargar el Timer 0

El Timer 0, al igual que los otros dos Timers, consiste en un contador ascendente. Como el
desbordamiento y final de la cuenta se produce al pasar de 0xFF (255)  0x00, el valor que deseas
temporizar debes indicarlo en forma de complemento. Por ejemplo, si quieres temporizar 43 ciclos de reloj
(4Tosc) y cargas directamente el valor 43 en el registro TMR0, la temporización real será de 213 ciclos, que
es lo que le falta al 43 para alcanzar el valor 256. Sin embargo, si cargas el complemento del 43 (213),
efectivamente son 43 los pulsos necesarios para llegar a 256.

El complemento de un número se calcula cambiando los bits “0” por bits “1” y viceversa. Por
ejemplo, 43 = 0x2B = 0b0010 1011. Su complemento es 0b1101 0100 = 0xD4 = 212. No te preocupes, el
ensamblador se encargará de hacer por ti esta conversión mediante la expresión:

movlw ~.43 ;Cargar el registro W con el complemento del valor 43 en decimal

T-9.2.7 Ahora tú

En los siguientes ejercicios se te pide configurar al Timer 0 para que trabaje en diferentes
condiciones. Modifica únicamente los bits que sean necesarios en cada registro, el resto los dejas con sus
valores por defecto. Indica también el valor a cargar en el registro propio del temporizador, el registro
especial del TMR0, que se encuentra en la posición 0x01 de los bancos 0 y 2 del área de datos.

Ejercicio 1

El oscilador general del sistema trabaja a 4 MHz por lo que el ciclo de instrucción es de 1 µS
(4Tosc). Se desea que el Timer 0 provoque una interrupción al de 10 mS.

a) Seleccionar el tipo de reloj y el preescaler

Nombre: OPTION_REG (Registro de Dirección: 0x01 Bancos: 1 y 3


opciones)
/RBU INTEDG T0CS T0SE PSA PSA2 PSA1 PSA0

9-9
www.mkelectronica.com Microcontroladores PIC: Nivel I
b) Calcular el valor que hay que cargar en el registro del Timer 0 (debe ser un número entero)

ó −
= = ___________________
×

c) Cargar el TMR0

NOMBRE: TMR0 (Registro del Timer 0) DIR.: 0x01 BANCO: 0 y 2


Bit 7 6 5 4 3 2 1 Bit 0

d) Habilitar la interrupción

NOMBRE: INTCON (Registro de control de interrupciones) DIR.: 0x0B BANCO:


Todos
GIE PEIE T0IE INTE RBIE TOIF INTF RBIF

Ejercicio 2

Una cinta transporta una serie de piezas. Un sensor proporciona un pulso activo por flanco
descendente cada vez que una pieza pasa frente a él. Se desea producir una interrupción cuando hayan
pasado 35 piezas.

a) Seleccionar el tipo de reloj y el preescaler

Nombre: OPTION_REG (Registro de Dirección: 0x01 Bancos: 1 y 3


opciones)
/RBU INTEDG T0CS T0SE PSA PSA2 PSA1 PSA0

b) Calcular el valor que hay que cargar en el registro del Timer 0 (debe ser un número entero)

= = ___________________

c) Cargar el TMR0

NOMBRE: TMR0 (Registro Timer 0) DIR.: BANCO:


0x01 0y2
Bit 7 6 5 4 3 2 1 Bit 0

d) Habilitar la interrupción

NOMBRE: INTCON (Registro de control de interrupciones) DIR.: 0x0B BANCO:


Todos
GIE PEIE T0IE INTE RBIE TOIF INTF RBIF

T-9.3 EL TIMER 1 (TMR1)

9-10
www.mkelectronica.com Microcontroladores PIC: Nivel I
Se trata de un temporizador de 16 bits muy similar al que disponen gran parte de dispositivos de las
familias PIC16 y PIC18. Sus características más relevantes son las siguientes:
 Temporizador/Contador ascendente de 16 bits que se forma mediante la pareja de
registros especiales TMR1H:TMR1L del área de datos.
 Puede trabajar con el reloj interno del sistema (modo temporizador) o con una fuente de
reloj externa (modo contador). Opcionalmente puede trabajar con un oscilador LP de
bajo consumo.
 Prescaler de 4 niveles.
 Puede operar de forma síncrona o asíncrona.
 Control de disparo para habilitar la cuenta (Timer 1 Gate), mediante una señal externa
aplicada por la patilla RB5/T1G, o bien mediante el empleo de uno de los comparadores
internos.
 Capacidad de interrupción con el desbordamiento (al pasar de 0xFFFF a 0x0000) y/o de
despertar al controlador (Wake-Up) si se encuentra en el modo SLEEP de bajo consumo.
 Se emplea como base de tiempos en los modos de captura y comparación de los
módulos CCP.

T-9.3.1 Funcionamiento del Timer 1

El Timer 1 está representado por la pareja de registros especiales TMR1H:TMR1L. Forman así un
contador ascendente de 16 bits, que se incrementa en cada flanco ascendente de la señal de reloj. Cada
vez que se lee esta pareja de registros, se obtiene el estado actual de la cuenta o temporización. Al escribir
sobre ellos, se realiza una nueva. En la figura tienes el esquema por bloques.

Con el bit TMR1CS del registro T1CON, se selecciona la fuente de reloj con la que evolucionará el
Timer 1: a nivel “0” el oscilador interno, a “1” el oscilador externo. Cuando se selecciona el reloj interno se
dice que el Timer 1 trabaja en el modo temporizador. Utiliza la frecuencia del oscilador del sistema dividida
entre 4 (Fosc/4) o, lo que es lo mismo, 4Tosc.

Cuando se emplea un reloj externo, el Timer 1 puede trabajar como un contador de 16 bits o un
temporizador. En el modo contador el Timer 1, se incrementa con el flanco ascendente de la señal externa
aplicada por RC0/T1CKI, que puede sincronizarse o no con la frecuencia interna del sistema.

9-11
www.mkelectronica.com Microcontroladores PIC: Nivel I
En el modo temporizador el Timer 1 dispone de un oscilador de 32.768 KHz que se estabiliza
mediante un cristal de cuarzo externo de ese mismo valor conectado entre las patillas RC0/T1OSO y
RC1/T1OSI. Este oscilador de bajo consumo (LP) se activa mediante el bit T1OSCEN del registro T1CON, y
se mantiene en funcionamiento aunque el controlador se encuentre en el modo SLEEP de bajo consumo.

El prescaler asociado al Timer 1 permite dividir la fuente de reloj entre 1, 2, 4 u 8. Para seleccionar
el valor de división dispones de los bits T1CKPS<1:0> del registro T1CON. Este prescaler no se puede leer
o escribir directamente. Basta saber que cada vez que se escribe sobre el Timer 1 (TMR1H:TMR1L), el
prescaler se inicia de nuevo. La temporización total queda establecida por:

ó = ×( × )

De aquí puedes deducir el valor que debes cargar en el TMR1 para realizar una determinada
temporización:
ó
=
×

Debes de tener en cuenta que el Timer 1 es un temporizador de 16 bits. Si el resultado de la


ecuación fuera mayor de 65536 (216), no cabrá en la pareja de registros TMR1H:TMR1L. Aunque lo ideal es
elegir el mínimo prescaler posible, si se diera el caso anterior deberás elegir un prescaler mayor para que el
valor en el TMR1 sea menor.

Ejemplo: Trabajando a una frecuencia de 4 MHz (4Tosc=1 µS) realizar una temporización de 250000 µS
(0,25 seg.) con un prescaler de 1:2. Calcular el valor a cargar en el Timer 1:

= =
×

Como el valor a cargar en el Timer 1 es mayor de 65536, habrá que elegir un prescaler mayor, por ejemplo
de 1:4. Entonces:

= =
×

El ensamblador facilita la carga de ese valor sobre los registros TMR1H y TMR1L. Fíjate:

movlw low ~.62500 ;Carga la parte de menos peso del complemento de 62500
movwf TMR1L ;Almacena en TMR1L
movlw high ~.62500 ;Carga la parte de más peso del complemento de 62500
movwf TMR1H ;Almacena en TMR1H

Con el bit /T1SYNC del registro T1CON se puede conseguir que la fuente de reloj externa se
sincronice o no con las fases del reloj interno del sistema. Si se pone a nivel “1”, se elige el modo asíncrono.
Este último permite que el Timer 1 siga trabajando con el oscilador externo o el oscilador LP de 32,768 KHz,
aun cuando el controlador se encuentre detenido en el modo SLEEP de bajo consumo. Esto implica que el
sistema puede ser interrumpido cuando haya desbordamiento, se despierte, salga del modo SLEEP (Wake-
Up) y ejecute el tratamiento correspondiente.

T-9.3.2 Control de disparo del Timer 1

Una de las características que diferencia al Timer 1 de los dispositivos PIC16F88X frente a otros, es
la posibilidad de controlar su funcionamiento mediante dos eventos: una señal externa aplicada por la patilla
RB5/T1G o bien mediante la salida del comparador de tensiones analógicas C2.

Estos eventos permiten que la cuenta o temporización que está realizando el Timer 1 se detenga o
reanude (stop/start) en un momento dado. Mediante el bit T1GSS de un registro, el CM2CON, se selecciona

9-12
www.mkelectronica.com Microcontroladores PIC: Nivel I
si el evento para activar o no al Timer 1, es la señal externa aplicada por la patilla RB5/T1G (por defecto), o
la señal de salida que produce el comparador C2.
En cualquier caso, mediante el bit T1GINV del registro T1CON, puedes seleccionar la polaridad de
dichos eventos. Cuando este bit se pone a nivel “1”, el Timer 1 reanuda la cuenta/temporización (start)
siempre que el evento se encuentre a “1” y se detiene (stop) si está a “0”. Cuando este bit se pone a “0”, el
Timer 1 reanuda la cuenta/temporización (start) cuando el evento se encuentra a “0” y se detiene (stop) si
está a “1”.

T-9.3.3 La interrupción del Timer 1

Cuando la pareja de registros TMR1H:TMR1L que forman el Timer 1 se desborda y pasa de 0xFFFF
a 0x0000, el bit TMR1IF del registro PIR1 se activa automáticamente. Esto indica el final de la
cuenta/temporización. Si además, deseas que se provoque una interrupción, deberás activar los siguientes
bits:

 El bit TMR1IE del registro PIE1 para habilitar la interrupción específica del Timer 1.
 El bit PEIE del registro INTCON para dar permiso de interrupción a los periféricos.
 El bit GIE del registro INTCON para dar permiso global de interrupciones.

Antes de habilitar la interrupción es aconsejable borrar la pareja de registros TMR1H:TMR1L (poner


el Timer 1 a 0x0000) así como el bit TMR1IF.

T-9.3.4 El Timer 1 en el modo SLEEP

El Timer 1 es uno de los periféricos que pueden seguir trabajando aunque el controlador se
encuentre detenido en el modo SLEEP de bajo consumo. Es más, él mismo puede provocar una
interrupción al desbordar y sacar al controlador de ese modo, “despertándolo” para ejecutar el oportuno
programa de tratamiento. Para ello, es necesario configurarlo en el modo de contador asíncrono y habilitar
la correspondiente interrupción:

 Poner a “1” el bit TMR1ON de T1CON para


activar el Timer 1.
 Activar el bit TMR1CS de T1CON para
seleccionar la fuente externa de reloj.
 Activar el bit T1SYNC de T1CON para
seleccionar el modo asíncrono.
 Activar el bit TMR1IE del registro PIE1 para
habilitar la interrupción específica del Timer
1.
 Activar el bit PEIE del registro INTCON para
dar permiso de interrupción a los periféricos.
 Activar el bit GIE del registro INTCON para
dar permiso global de interrupciones.

Además, puedes emplear el oscilador interno de 32,768 KHz activando el bit T1OSCEN del registro
T1CON. Esto te permite emplear esta estratégica frecuencia para aplicaciones horarias como un reloj en
tiempo real (RTC). Efectivamente, si conectas un cristal de cuarzo de ese mismo valor entre las patillas
RC0/T1OSO y RC1/T1OSI como se muestra en la figura de arriba, puedes llevar a cabo un control horario
con mucha precisión.

A esa frecuencia de trabajo basta cargar al Timer 1 con el valor 0x8000 (32768) para que desborde
e interrumpa exactamente cada segundo. El programa de tratamiento se encargará de llevar la cuenta de
los segundos transcurridos, minutos, horas, etc. Además, entre un segundo y el siguiente, el controlador
puede encontrarse en el modo SLEEP. Puedes diseñar una aplicación horaria con un consumo muy
reducido.

9-13
www.mkelectronica.com Microcontroladores PIC: Nivel I
T-9.3.5 El registro de control T1CON

Es el registro que te va a permitir configurar los diferentes modos de trabajo asociados al Timer 1.
Se muestra a continuación:

Nombre: T1CON (Registro de control del Dirección: 0x10 Banco: 0


Timer 1)
R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0
T1GIN TMR1GE T1CKPS1 T1CKPS0 T1OSCEN /T1SYNC TMR1CS TMR1ON

T1GINV Polaridad de disparo para el Timer 1


1 = El Timer 1 funciona cuando el evento se encuentra a “1”
0 = El Timer 1 funciona cuando el evento se encuentra a “0”
TMR1GE Activación de la función de disparo
Si el bit TMR1ON=0
Este bit se ignora
Si el bit TMR1ON=1
1 = La evolución del Timer 1 se controla con los eventos
0 = La evolución del Timer 1 es constante e independiente de los eventos
T1CKPS<1:0> Selección del prescaler para el Timer 1
11 = Prescaler de 1:8
10 = Prescaler de 1:4
01 = Prescaler de 1:2
00 = Prescaler de 1:1
T1OSCEN Activación del oscilador interno LP de 32,768 KHz
1 = El oscilador LP se emplea como reloj del Timer 1
0 = El oscilador LP en Off
/T1SYNC Sincronismo del reloj externo del Timer 1
TMR1CS=1
1 = El reloj externo del Timer 1 no se sincroniza con el reloj del sistema
0 = El reloj externo del Timer 1 se sincroniza con el reloj del sistema
TMR1CS=0
Este bit se ignora ya que en este caso se emplea el propio reloj interno del
sistema
TMR1CS Selección de la fuente de reloj para el Timer 1
1 = Reloj externo desde la patilla RC0/T1CKI (sensible al flanco ascendente)
0 = Reloj interno del sistema (Fosc/4 o 4Tosc)
TMR1ON Activación del Timer 1
1 = Activa el Timer 1
0 = Desactiva el Timer 1

T-9.3.6 Otros registros asociados con el Timer 1

En la figura se muestra un resumen de todos los registros y bits que tienen algo que ver con la
configuración del Timer 1, su funcionamiento y su capacidad de interrupción. Los bits sombreados no tienen
relación alguna.

9-14
www.mkelectronica.com Microcontroladores PIC: Nivel I
T-9.3.7 Ahora tú

En los siguientes ejercicios debes configurar al Timer 1 para que trabaje en diferentes condiciones.
Modifica únicamente los bits que sean necesarios en cada registro, el resto los dejas con sus valores por
defecto. Indica también el valor a cargar en los registros propios del temporizador, los registros TMR1L y
TMR1H, que se encuentran en las posiciones 0x0E y 0x0F del banco 0 del área de datos respectivamente.

Ejercicio 1

Calcular la máxima temporización que se puede conseguir con el TMR1 trabajando a una frecuencia
general del sistema (Fosc) de 1 MHz. Configurar los registros apropiados para producir interrupción cuando
transcurra esa temporización.

a) Calcular la máxima temporización posible y el valor a cargar en el Timer 1

ó = ×( × ) = ________________

ó
= = ___________________
×

b) Configurar el Timer 1

Nombre: T1CON (Registro de control del Dirección: 0x10 Banco: 0


Timer 1)
T1GIN TMR1GE T1CKPS1 T1CKPS0 T1OSCEN /T1SYNC TMR1CS TMR1ON

c) Cargar el Timer 1

NOMBRE: TMR1H (Parte alta del DIR.: BANCO:


Timer 1) 0x0E 0
Bit 7 6 5 4 3 2 1 Bit 0

NOMBRE: TMR1L (Parte baja del DIR.: BANCO:


Timer 1) 0x0F 0
Bit 7 6 5 4 3 2 1 Bit 0

d) Habilitar interrupciones

NOMBRE: PIE1 (Registro nº 1 para la habilitación de DIR.: 0x8C BANCO: 1


interrupciones)
---- ADIE RCIE TXIE SSPIE CCP1IE TMR2IE TMR1IE

NOMBRE: INTCON (Registro de control de interrupciones) DIR.: 0x0B BANCO:


Todos

9-15
www.mkelectronica.com Microcontroladores PIC: Nivel I
GIE PEIE T0IE INTE RBIE TOIF INTF RBIF

Ejercicio 2

Provocar una interrupción por segundo. El Timer 1 se alimenta de un cristal de cuarzo externo a
32,768 KHz.
a) Configurar el Timer 1

Nombre: T1CON (Registro de control del Dirección: 0x10 Banco: 0


Timer 1)
T1GIN TMR1GE T1CKPS1 T1CKPS0 T1OSCEN /T1SYNC TMR1CS TMR1ON

b) Cargar el Timer 1

NOMBRE: TMR1H (Parte alta del DIR.: BANCO:


Timer 1) 0x0E 0
Bit 7 6 5 4 3 2 1 Bit 0

NOMBRE: TMR1L (Parte baja del DIR.: BANCO:


Timer 1) 0x0F 0
Bit 7 6 5 4 3 2 1 Bit 0

c) Habilitar interrupciones

NOMBRE: PIE1 (Registro nº 1 para la habilitación de DIR.: 0x8C BANCO: 1


interrupciones)
---- ADIE RCIE TXIE SSPIE CCP1IE TMR2IE TMR1IE

NOMBRE: INTCON (Registro de control de interrupciones) DIR.: 0x0B BANCO:


Todos
GIE PEIE T0IE INTE RBIE TOIF INTF RBIF

T-9.4 EL TIMER 2 (TMR2)

Se trata del tercero y último de los temporizadores disponibles. Es de 8 bits y muy similar al empleado
por otros dispositivos de la gran familia de controladores PIC. Sus características principales son las
siguientes:

 Timer de 8 bits representado en el registro TMR2 del área de datos.


 Está asociado a un registro de periodos, el PR2, también representado en el área de datos.
 Capacidad de interrupción.
 Prescaler seleccionable de 3 niveles (1:1. 1:4 y 1:16).
 Postcaler seleccionable de 16 niveles (desde 1:1 hasta 1:16).

T-9.4.1 Funcionamiento del Timer 2

La fuente de reloj en base a la cual evoluciona el contador del Timer 2, es siempre el reloj interno
del sistema (Fosc/4 = 4Tosc). Tal y como se muestra en la figura, esta señal de reloj se aplica a un
prescaler con escalas de 1:1, 1:4 y 1:16 antes de que llegue al Timer 2 propiamente dicho. Es decir, este

9-16
www.mkelectronica.com Microcontroladores PIC: Nivel I
Timer 2 se incrementa a la velocidad que establece el oscilador principal dividida entre 1, 4 o 16. Por
ejemplo, si la frecuencia F del sistema es de 4 MHz, el periodo T de la misma es de 250 nS, lo que
corresponde a una Fosc/4 de 1 MHz o un 4Tosc de 1 µS. Así pues el Timer 2 se puede incrementar cada 1
µS, cada 4 µS o cada 16 µS. El valor del prescaler se selecciona mediante los bits T2CKPS<1:0> del
registro T2CON.

El valor del Timer 2 (registro TMR2) se compara constantemente con el valor del registro de
periodos PR2, y se va incrementando hasta que ambos valores se igualan. En este momento ocurren tres
sucesos:

1. El Timer 2 se pone a 0 (TMR2 = 0x00).


2. El postcaler asociado al Timer 2 se incrementa.
3. El proceso se vuelve a repetir empezando nuevamente desde 0.

Cada vez que el TMR2 iguala al registro de periodos PR2 se produce un incremento del postcaler.
Cuando éste alcance el valor seleccionado mediante los bits TOUTPS<3:0> del registro T2CON (desde 1
hasta 16), se activa el bit TMR2IF del registro PIR1. En este punto, si lo deseas, se puede provocar
interrupción activando el bit TMR2IE del registro PIE1, así como los bits GIE y PEIE del registro INTCON.

Tanto el registro del Timer 2 (TMR2), como el registro de periodos (PR2), son registros de 8 bits que
se encuentran en el área de datos del controlador. Como tal se pueden leer y escribir en cualquier
momento.

El uso del Timer 2 es ideal para aquellas aplicaciones en las que sea necesario realizar
temporizaciones periódicas. Efectivamente, el registro PR2 de periodos se carga con el valor de la
temporización deseada. Cuando ésta finaliza, se inicia automáticamente una nueva con el mismo valor (a no
ser que se modifique en el PR2).

Ni el prescaler ni el postcaler pueden ser modificados por el programa del usuario. La única forma
de iniciarlos es:

 Cuando se escribe sobre el TMR2 un nuevo valor.


 Cuando se escribe sobre el registro de control T2CON para variar alguna configuración del Timer 2.
 Cuando se produce cualquiera de los tipos de RESET admitidos por el controlador.

La temporización total que puede realizar el Timer 2 antes de que se active el bit TMR2IF y, si
acaso, provoque interrupción, se puede determinar según la siguiente fórmula:

ó = × × ×

De aquí se desprende que:

ó
=
× ×

La duración del periodo del Timer 2 se calcula por:

9-17
www.mkelectronica.com Microcontroladores PIC: Nivel I
= × ×

De donde se desprende que:

=
×

Al igual que con los Timers anteriores, debes de tener en cuenta que el Timer 2 es un temporizador
8
de 8 bits. Si el resultado de la ecuación fuera mayor de 256 (2 ), no cabrá en el registro PR2. Aunque lo
ideal es elegir el mínimo prescaler posible, si se diera el caso anterior, deberás elegir un prescaler mayor
para que el valor en el PR2 sea menor.

El Timer 2 (TMR2) trabaja siempre junto con el registro de periodos PR2. Cuando el TMR2 alcanza
el valor del PR2, se pone a 0 y comienza una nueva cuenta. Lo normal es que inicialmente el registro TMR2
se cargue con 0, y el registro PR2 con el valor que se desea temporizar.

T-9.4.2 El registro T2CON

Es el registro con el que podemos configurar el funcionamiento del Timer 2. Se muestra a


continuación:

Nombre: T2CON (Registro de control del Dirección: 0x12 Banco: 0


Timer 2)
U-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0
---- TOUTPS3 TOUTPS2 TOUTPS1 TOUTPS0 TMR2ON T2CKPS1 T2CKPS0

Bit 7 No implementado, se lee a nivel “0”


TOUTPS<3:0> Selección del postcaler del Timer 2
0000 = Postcaler 1:1 1000 = Postcaler 1:9
0001 = Postcaler 1:2 1001 = Postcaler 1:10
0010 = Postcaler 1:3 1010 = Postcaler 1:11
0011 = Postcaler 1:4 1011 = Postcaler 1:12
0100 = Postcaler 1:5 1100 = Postcaler 1:13
0101 = Postcaler 1:6 1101 = Postcaler 1:14
0110 = Postacler 1:7 1110 = Postcaler 1:15
0111 = Postcaler 1:8 1111 = Postcaler 1:16
TMR2ON Activación del Timer 2
1 = Timer 2 activado
0 = Timer 2 desactivado
T2CKPS<1:0> Selección del prescaler del Timer 2
00 = Prescaler 1
01 = Prescaler 4
1X = Prescaler 16

T-9.4.3 Registros relacionados con el Timer 2

La tabla de la figura muestra los registros y bits asociados al Timer 2

9-18
www.mkelectronica.com Microcontroladores PIC: Nivel I
T-9.4.4 Ahora tú

Con los siguientes ejercicios vas a configurar al Timer 2 para que trabaje en diferentes condiciones.
Modifica únicamente los bits que sean necesarios en cada registro, el resto los dejas con sus valores por
defecto. Partiendo de que el registro TMR2 se inicia siempre con 0, indica también el valor a cargar en el
registro de periodos PR2. Ambos se encuentran en las posiciones 0x11 y 0x92 de los bancos 0 y 1
respectivamente del área RAM de datos.

Ejercicio 1

Suponiendo que Fosc es de 4 MHz y seleccionas un prescaler de 1:1, configura el Timer 2 para que
produzca una interrupción cada 1 mS.

a) Configurar el Timer 2

Nombre: T2CON (Registro de control del Dirección: 0x12 Banco: 0


Timer 2)
---- TOUTPS3 TOUTPS2 TOUTPS1 TOUTPS0 TMR2ON T2CKPS1 T2CKPS0

b) Calcular el valor a cargar en los registros TMR2 y PR2

ó
= = _____________________
× ×

c) Cargar el valor en los registros TMR2 y PR2

NOMBRE: TMR2 (Registro del Timer DIR.: BANCO:


1) 0x11 0
Bit 7 6 5 4 3 2 1 Bit 0

NOMBRE: PR2 (Registros de DIR.: BANCO:


periodos del Timer 2) 0x92 1
Bit 7 6 5 4 3 2 1 Bit 0

d) Habilitar interrupciones

NOMBRE: PIE1 (Registro nº 1 para la habilitación de DIR.: 0x8C BANCO: 1


interrupciones)
---- ADIE RCIE TXIE SSPIE CCP1IE TMR2IE TMR1IE

NOMBRE: INTCON (Registro de control de interrupciones) DIR.: 0x0B BANCO:


Todos
GIE PEIE T0IE INTE RBIE TOIF INTF RBIF

9-19
www.mkelectronica.com Microcontroladores PIC: Nivel I
Ejercicio 2

Suponiendo que Fosc es de 2 MHz, configura el Timer 2 para que produzca una interrupción cada
0.1 seg. aproximadamente. Determina los valores necesarios tanto para el prescaler como para el postcaler,
así como para el registro PR2.

a) Configurar el Timer 2

Nombre: T2CON (Registro de control del Dirección: 0x12 Banco: 0


Timer 2)
---- TOUTPS3 TOUTPS2 TOUTPS1 TOUTPS0 TMR2ON T2CKPS1 T2CKPS0

b) Calcular el valor a cargar en los registros TMR2 y PR2

ó
= = _____________________
× ×

c) Cargar el valor en los registros TMR2 y PR2

NOMBRE: TMR2 (Registro del Timer DIR.: BANCO:


1) 0x11 0
Bit 7 6 5 4 3 2 1 Bit 0

NOMBRE: PR2 (Registros de DIR.: BANCO:


periodos del Timer 2) 0x92 1
Bit 7 6 5 4 3 2 1 Bit 0

d) Habilitar interrupciones

NOMBRE: PIE1 (Registro nº 1 para la habilitación de DIR.: 0x8C BANCO: 1


interrupciones)
---- ADIE RCIE TXIE SSPIE CCP1IE TMR2IE TMR1IE

NOMBRE: INTCON (Registro de control de interrupciones) DIR.: 0x0B BANCO:


Todos
GIE PEIE T0IE INTE RBIE TOIF INTF RBIF

9-20
www.mkelectronica.com Microcontroladores PIC: Nivel I
AREA DE PRÁCTICAS

P-9.1 EJEMPLO 9-1: Temporización simple con el TMR0

Observarás que para resolver este sencillo ejemplo, no era necesario emplear ningún tipo de
temporizador. Con los conocimientos que tienes debieras de ser capaz de activar una salida durante un
cierto tiempo cada vez que se active una entrada. Recuerda la librería “MSE_Delay.inc” y su macro “Delay”
para realizar temporizaciones.

Sin embargo, vas a emplear el Timer 0 para tener una primera toma de contacto con el mismo,
configurarlo y cargarlo con el valor deseado para consumir un cierto tiempo.

P-9.1.1 Descripción del programa fuente

En primer lugar, tras la secuencia de RESET el registro OPTION configura al Timer 0 para que
actúe en el modo temporizador, con fuente de reloj interno y un prescaler de 256 asociado al mismo. Esto
nos da una detalle importante. Sabes que el controlador trabaja a una frecuencia Fosc de 4 MHz, por lo que
Fosc/4 será de 1 MHz. El reloj general del sistema tendrá por tanto un periodo T de 1 µS (4Tosc). Si el
prescaler elegido es de 256, el Timer 0 se incrementa cada 256 µS. A esta velocidad y con ese prescaler la
máxima temporización que puede realizar el Timer 0 es de unos 65 mS (28*256).

En el ejemplo se ha diseñado la rutina “Delay” para realizar una temporización variable en función
de la constante “Valor”. Dicha temporización emplea al Timer 0 para realizar un retardo de 50 mS que se
repetirá las veces que sea necesario. Para conseguir un retardo de 50.000 µS cargamos al Timer con el
valor 195 (0xC3) que resulta de dividir 50.000/256. Ahora bien, como el Timer 0 es un contador ascendente,
el valor que cargamos es el complemento de 195 (0x3C), que es lo que le falta para desbordar y llegar a 0.
¡Este detalle es importante! En ensamblador es muy fácil hacerlo mediante:

Delay_1 movlw ~.195


movwf TMR0 ;Inicia el Timer 0 con 195 (195*256=49.9 mS)

Cada vez que se activa el bit TMR0IF del registro INCON es porque el TMR0 ha finalizado la
temporización de 50 mS (50.000 µS). Ésta se repite tantas veces como se indique en la constante “Valor”.
En el ejemplo se repite 20 veces, lo que hace una temporización total de 1 seg (20*50 mS).

Por último, indicar que el cuerpo principal del programa es muy sencillo. Espera a que la entrada
RA0, conectada con el pulsador E4 del laboratorio USB-PIC’School, se ponga a nivel “0”. En este momento
se activa la línea de salida RB0 en la que se ha conectado el led S0. Seguidamente se ejecuta la rutina
“Delay” y finaliza desactivando RB0. El ciclo se repite de forma indefinida.

P-9.1.2 Montaje eléctrico

Es el mostrado en la figura. El pulsador E4 se


E0 S0 RB0
conecta con la entrada RA0. El led S0 se conecta
E1 S1
con la línea de salida RB0.
E2 S2

E3 S3 Cada vez que se detecte una pulsación en E4 la


E4 RA0 S4 salida S0 se activa durante un cierto tiempo
E5 S5 controlado por el Timer 0.
E6 S6

E7 S7

E. DIGITALES
SALIDAS DIGITALES

9-21
www.mkelectronica.com Microcontroladores PIC: Nivel I
P-9.1.3 Grabación del dispositivo y comprobaciones finales

Una vez grabado el PIC y alimentado el sistema, basta con que acciones el pulsador. Observa que
con cada pulsación el led de salida se ilumina durante un tiempo determinado según la constante “Valor” y
controlado por el Timer 0. Luego se apaga hasta una nueva pulsación.

P-9.1.4 Ahora tú

Poco se puede hacer con este sencillo ejemplo. Quizá puedas experimentar variando los valores de
temporización mediante la constante “Valor”. Una línea de trabajo puede consistir en realizar
temporizaciones más precisas.

Para experimentar con rutinas de


temporización, es una buena idea emplear el
“Simulador” del MPLAB-IDE como lo hiciste
con los ejemplos de las Unidades 3 y 4. El
simulador dispone de la ventana StopWatch,
como la mostrada en la figura, que permite
analizar con precisión los tiempos consumidos
durante la ejecución. ¿Te acuerdas de ella? Te
aconsejo que retomes el tema y emplees esta
técnica para conseguir temporizaciones lo más
precisas posible.

Para concluir y, en honor a la verdad, hay que decir que este ejemplo no representa
adecuadamente la importancia del empleo de los Timers. Fíjate en un detalle. Cuando el controlador ejecuta
la rutina “Delay”, se queda esperando a que el Timer 0 finalice su retardo de 50 mS que lo repite en 20
ocasiones. Durante ese tiempo ¡no hace nada útil! En fin, se trataba de hacer un sencillo ejemplo que
mostrara cómo configurar el Timer 0, cargarlo con un valor y esperar a que termine la temporización.

P-9.2 EJEMPLO 9-2: Interrupción con el TMR0

Éste sí es un buen ejemplo que demuestra la utilidad del Timer 0. En esta ocasión, empleamos su
capacidad de interrupción para pedir la atención del controlador cuando finaliza una temporización. Lo
importante es que mientras eso ocurre, el controlador se encuentra realizando otra tarea como es
comprobar y monitorizar constantemente el estado de dos señales de entrada.

Para demostrarlo, el ejemplo visualiza sobre los leds S0 y S1 conectados con las salidas RB0 y
RB1, el estado de los interruptores E0 y E1 del laboratorio conectados con las entradas RA0 y RA1. Al
mismo tiempo sobre la salida RB3, conectada con el led S3, se genera una intermitencia constante de 0,5
seg.

P-9.2.1 Descripción / Edición del programa fuente

En primer lugar, tras la secuencia de RESET el registro OPTION configura al Timer 0 para que
actúe en el modo temporizador, con fuente de reloj interna y un prescaler de 256 asociado al mismo.
Trabajando a 4 MHz el Timer 0 se incrementará cada 256 µS.

Seguidamente el Timer se carga con el valor 39 (0x27) para provocar una interrupción cada 10 mS
(39*256=9.9 mS). Debes recordar que al tratarse de un contador ascendente, se le carga con el
complemento de 39 (0xD8). Se inicia un contador con el valor 50 que representa el número de
interrupciones que se deben de producir para que la salida RB3 cambie de estado cada 0,5 seg (10 mS*50).
A continuación, mediante el registro INTCON, se activa el bit T0IE para la habilitación de la interrupción del
Timer 0 y el bit GIE de habilitación global de interrupciones. El Timer 0 comienza su temporización de 10
mS.

9-22
www.mkelectronica.com Microcontroladores PIC: Nivel I
El cuerpo del programa principal consiste en leer constantemente el estado de las entradas RA0 y
RA1 para reflejarlo sobre las salidas RB0 y RB1 respectivamente.

Cuando el Timer 0 finaliza su temporización de 10 mS se produce la interrupción. El programa de


tratamiento comprueba si se han producido 50 interrupciones. Si no es así, se retorna al programa principal
sin llevar a cabo ninguna acción. En caso de que se hayan producido ese número de interrupciones, la
salida RB3 cambia de estado. En cualquiera de los casos el Timer 0 se recarga con 39 (0x27) para realizar
una nueva temporización y se repone el bit T0IF.

P-9.2.2 Montaje eléctrico


E0 RA0 S0 RB0

Es el mostrado en la figura. Los interruptores E1 RA1 S1 RB1

E0 y E1 se conectan con las líneas de entradas RA0 y E2 S2


RA1 mientras que los leds S0 y S1 del laboratorio se E3 S3 RB3
conectan con las salidas RB0 y RB1 para monitorizar E4 S4
el estado de esas entradas. El led S3 se conecta con E5 S5
la salida RB3 que producirá una intermitencia cada
E6 S6
0,5 seg.
E7 S7

E. DIGITALES
SALIDAS DIGITALES

P-9.2.3 Grabación del dispositivo y comprobaciones finales

Para grabar, primero debes deshabilitar el depurador mediante Debugger  Select Tool  None y
luego habilitar el grabador mediante Programmer  Select Programmer  PICkit 2. Mediante el botón
Program the target device grabarás el programa en la memoria flash del controlador.

Una vez grabado comprueba que el led S3 conectado en RB3 realiza una intermitencia cada 0,5
seg. También debes constatar que, independientemente de la salida S3, las salidas S0 y S1 reflejan de
forma constante e inmediata el estado de las entradas E0 y E1.

P-9.2.4 Ahora tú

Con este ejemplo te debe quedar clara la importancia del empleo de un Timer y su correspondiente
interrupción. Se demuestra perfectamente que, mientras el Timer está temporizando los 10 mS, el
controlador está realizando algo tan útil como es leer el estado de las entradas y reflejarlo sobre las salidas.

Piensa que, durante esos 10 mS de temporización, el controlador puede ejecutar un programa


equivalente a unas 10.000 instrucciones si suponemos que su velocidad de trabajo (Fosc) es de 4 MHz. ¿Te
imaginas la cantidad de tareas que se pueden desarrollar durante ese tiempo?

P-9.3 EJEMPLO 9-3: El TMR0 como contador de eventos externo

Como ya se ha explicado en el área de teoría, otra de las formas de hacer funcionar a un Timer es
en el modo contador. Es lo que vas a hacer en este ejemplo con el Timer 0.

Consiste en contar 6 pulsos externos procedentes del generador lógico incluido en el laboratorio
USB-PIC’School. Sobre el display de 7 segmentos de las unidades se va visualizando el número de pulsos
externos que van entrando. Cuando llegue el sexto el display ilumina todos sus segmentos durante un
segundo, luego se apaga y el sistema se detiene quedando en el modo SLEEP de bajo consumo. Para
comenzar una nueva cuenta es necesario pulsar el botón RESET del laboratorio.

9-23
www.mkelectronica.com Microcontroladores PIC: Nivel I
P-9.3.1 Descripción / Edición del programa fuente

En primer lugar, tras la secuencia de RESET, el registro OPTION configura al Timer 0 para que
actúe en el modo contador de pulsos externos aplicados por la patilla RA4/T0CKI y activos al flanco
descendente. El prescaler se ajusta a 1:1.

Seguidamente el Timer se carga con el número de pulsos a contar, 6 (0x06). Recordar que, al
tratarse de un contador ascendente, se le carga con el complemento de 6 (0xF9). A continuación, mediante
el registro INTCON, se activa el bit T0IE para la habilitación de la interrupción del Timer 0 y el bit GIE de
habilitación global de interrupciones. El Timer 0 comienza a contar.

El cuerpo del programa principal consiste en leer el valor actual del Timer 0 o sea, el estado de la
cuenta, para visualizarlo sobre el display de las unidades del laboratorio. Se emplea una tabla de
decodificación de BCD a 7 segmentos similar a la utilizada en ejemplos anteriores.

Cuando el Timer 0 cuenta hasta 6 se produce la interrupción. Se desactiva tanto el bit T0IF como el
bit T0IE de interrupción. Se activan todos los segmentos del display, se temporiza 1 segundo y se
desactivan. Se ejecuta la instrucción “SLEEP” que detiene al controlador dejándolo en standby de bajo
consumo hasta que se reciba un RESET.

P-9.3.2 Montaje eléctrico

Es el mostrado en la figura. Las 8 líneas de la puerta B, RB0:RB7, actúan como salidas. Se


conectan con los segmentos a:dp del display de las unidades, cuyo ánodo común se conecta a +5 Vcc. La
salida de la señal que produce el generador lógico del laboratorio se conecta con la línea RA4/T0CKI que
actúa como entrada de pulsos externos para el Timer 0.

7 SEGMENTOS
U30
a RB0
b RB1
1Hz
c RB2 F.OUT.
d RB3 10Hz
RA4/T0CKI
SYM10

e RB4 100Hz
f RB5
1KHz
g RB6
dp RB7

AC DEC AC UNI
G. LOGICO
.

+5 Vcc

P-9.3.3 Grabación del dispositivo y comprobaciones finales

Una vez realizadas las conexiones, grabado el PIC y alimentado el sistema, basta comprobar que el
display va incrementándose a medida que llegan los pulsos externos procedentes del generador lógico.
Cuando llegue el sexto pulso el display ilumina todos sus segmentos durante 1 segundo, luego se apagan y
el sistema se detiene. Hay que provocar un RESET para iniciar un nuevo ciclo.

Sugiero que ajustes el generador lógico para que proporcione una frecuencia de 1 Hz en su señal
de salida y contar así 1 pulso por segundo. Esto te permitirá apreciar claramente la evolución de la cuenta.

P-9.3.4 Ahora tú

Supongo que se te ocurrirán un buen número de posibles aplicaciones relacionadas con la cuenta
de pulsos externos. Se me ocurre que podrías mejorar el ejemplo 5-4 que viste en la Unidad 5 ¿te
acuerdas? Se trataba de un automatismo consistente en simular una máquina de envasado. Había que
contar el número de piezas que debían depositarse en un envase. Ahora puedes utilizar el Timer 0 en el
modo contador para llevar a cabo la cuenta.

9-24
www.mkelectronica.com Microcontroladores PIC: Nivel I
P-9.4 EJEMPLO 9-4: Temporización e interrupción con el TMR1

Una de las ventajas que ofrece el empleo del Timer 1, es su capacidad de realizar temporizaciones
y/o cuentas más grandes que el Timer 0. Esto es posible fundamentalmente porque se trata de un contador
ascendente de 16 bits.

En este sencillo ejemplo el Timer 1 va a provocar una interrupción cada 0,1 seg (el Timer 0 con su
mayor prescaler únicamente podía temporizar 0,065 seg. como máximo). Esta interrupción servirá para
incrementar un contador binario que se visualizará sobre los leds S7:S0 del laboratorio conectados con las
líneas de salida RB7:RB0 de la puerta B.

P-9.4.1 Descripción / Edición del programa fuente

Tras la secuencia de RESET, se configuran las entradas y salidas y se habilita la interrupción del
Timer 1 activando el bit TMR1IE del registro PIE1. La velocidad de trabajo del sistema (Fosc) es de 4 MHz
así que el ciclo máquina (4Tosc) es de 1 µS. Se emplea un prescaler de 1:8, por lo que al Timer 1 hay que
cargarle con 12.500 para que temporice 100.000 µS (100000/8). Como se trata de un contador ascendente
y está formado por la pareja de registros TMR1H:TMR1L, la secuencia de instrucciones para su carga será:

movlw low ~.12500


movwf TMR1L
movlw high ~.12500
movwf TMR1H ;Carga el TMR1 con el valor 12500.

Esto se puede traducir como: “Cargar la parte de menos peso (low) del complemento de 12500
sobre el registro TMR1L. Cargar la parte de más peso (high) del complemento de 12500 sobre el registro
TMR1H”

La siguiente secuencia de instrucciones configura en el registro T1CON el modo de trabajo del


Timer 1 y lo activa. Comienza la temporización. Al activar los bits PEIE y GIE del registro INTCON, se
habilita el sistema de interrupciones.

movlw b'00110001' ;Selecciona reloj interno y prescaler de 8


movwf T1CON ;Habilita el TMR1
movlw b'11000000'
movwf INTCON ;Habilitación global de interrupciones

El cuerpo del programa principal no hace nada útil. Se limita a ejecutar un bucle cerrado infinito. Por
su parte, cuando se produce una interrupción al de 0,1 seg. (100.000 µS), el programa de tratamiento
recarga nuevamente el Timer 1 y repone el bit TMR1IF. El valor de la puerta B se incrementa en una unidad.

¡Aviso! Quizá tengas la tentación de colocar la instrucción SLEEP para detener el controlador y dejarlo en
standby de bajo consumo. Tus intenciones son buenas, pero no te va a funcionar. Ten en cuenta que el
Timer 1 está trabajando en el modo temporizador con el reloj del sistema. Si colocas al controlador en el
modo SLEEP, ese reloj también se detiene. Si no hay reloj, el Timer 1 no evoluciona por lo que nunca acaba
la temporización. Si no finaliza la temporización tampoco hay interrupción, por lo que el contador binario
sobre la puerta B no funcionará. Es decir, el sistema queda totalmente parado.

SALIDAS DIGITALES
P-9.4.2 Montaje eléctrico

Lo tienes en el esquema de la figura. Las 8 líneas de la puerta B,


S7

S6

S5

S4

S3

S2

S1

S0

RB0:RB7, actúan como salidas. Se conectan con los leds S0:S7 que
visualizarán, en binario, las décimas de segundo transcurridas.

RB7 RB6 RB5 RB4 RB3 RB2 RB1 RB0

9-25
www.mkelectronica.com Microcontroladores PIC: Nivel I
P-9.4.3 Grabación del dispositivo y comprobaciones finales

Una vez realizadas las conexiones, grabado el PIC y alimentado el sistema, basta comprobar que
los leds visualizan un contador que representa, en binario, el número de interrupciones producidas. Como
cada interrupción se produce cada 0,1 seg, podemos considerarlo un contador de décimas de segundo.

P-9.4.4 Ahora tú

Aprovechando la capacidad del Timer 1 para realizar temporizaciones más grandes que las que
hacía el Timer 0, se me ocurre que realices un cronómetro digital desde 0 hasta 9999 décimas de segundos
(999,9 seg). La visualización se realizará sobre la pantalla LCD. Puedes emplear los clásicos pulsadores
para el start/stop de la cuenta, puesta a 0, medida de lapsus de tiempo, registro de tiempos, etc. En fin, si
sabes cómo funciona un cronómetro, se trata de hacer uno con todas las mejoras y prestaciones que se te
ocurran.

Como el contador debe ser en decimal, te recomiendo que repases aquellos ejemplos en los que se
implementaba un contador de 00 a 99. Lo debes mejorar y ampliar para que sea capaz de contar desde
0000 hasta 9999.

P-9.5 EJEMPLO 9-5: El TMR1 como contador

El Timer 1 también puede actuar como contador de los pulsos externos que se aplica por la patilla
RC0/T1CKI. Con este ejemplo vas a ver este modo de trabajo. Para ello utilizarás el generador lógico del
laboratorio USB-PIC’School que suministrará los pulsos a contar con diferentes frecuencias.

Por la pantalla LCD se visualizará, en binario, la evolución del Timer 1 con la cuenta del número de
pulsos aplicados.

P-9.5.1 Descripción / Edición del programa fuente

Tras la secuencia de RESET se configuran las entradas y salidas, se borra el Timer 1 para iniciar la
cuenta desde 0 y se selecciona su modo de trabajo como contador de pulsos externos:

clrf TMR1L
clrf TMR1H ;Puesta a 0 del TMR1
movlw b'00000011'
movwf T1CON ;Configura TMR1 en modo contador

Una vez inicializada la pantalla LCD, el cuerpo del programa principal se limita a leer la parte alta del
Timer 1 (TMTR1H) y la parta baja (TMR1L) con el estado actual de la cuenta, para visualizarla sobre la
pantalla LCD mediante la rutina “Visualiza”. Esta rutina convierte los bits “0” y “1” en sus correspondientes
caracteres ASCII y los envía a la pantalla
PANTALLA LCD
P-9.5.2 Montaje eléctrico F.OUT.
1Hz
10Hz
2X16 RC0/T1CKI
SYM10

100Hz
Lo tienes en la figura. La pantalla 1KHz
R/W

LCD, al igual que en anteriores ejemplos, se


RS

D0
D1
D2
D3
D4
D5
D6
D7
E

conecta con las líneas RB0:RB3 para la


10
11
12
13
14
4
5
6

7
8
9

G. LOGICO
transferencia de datos y con las líneas RB3
RA1:RA3 para el control de la misma. La RB2
RB1
salida del generador lógico del laboratorio se RB0

conecta con la línea RC0/T1CKI para la RA1


RA2
S7

S6

S5

S4

S3

S2

S1

S0

entrada de los pulsos a contar. También se RA3


conecta con el led S0 que monitoriza dichos
pulsos. SALIDAS DIGITALES

9-26
www.mkelectronica.com Microcontroladores PIC: Nivel I
P-9.5.3 Grabación del dispositivo y comprobaciones finales

Una vez realizadas las conexiones, grabado el PIC y alimentado el sistema basta comprobar que en
la pantalla LCD aparece un número binario de 16 bits que representa el valor actual del Timer 1 actuando
como contador de pulsos externos. Este número se va incrementando con cada pulso de entrada
procedente del generador lógico del laboratorio.

P-9.5.4 Ahora tú

Tal y como has estudiado en el área de teoría, el Timer 1 en el modo contador se incrementa con
los flancos ascendentes de los pulsos externos. Esto lo puedes comprobar fácilmente observando el led S0
que monitoriza la señal del generador. El incremento del contador se produce justo cuando el led se activa.

La frecuencia del generador del laboratorio la puedes variar en cuatro rangos distintos: 1 Hz, 10 Hz,
100 Hz y 1 KHz. Lógicamente esto afectará a la velocidad con la que evoluciona el Timer 1.

También puedes analizar qué ocurre si, en lugar del generador, conectas el pulsador E4 con la
patilla RC0/T1CKI. Da una explicación:

____________________________________________________________________________________

____________________________________________________________________________________

____________________________________________________________________________________

____________________________________________________________________________________

P-9.6 EJEMPLO 9-6: El TMR1 como contador con control de disparo externo

Una nueva característica del Timer 1 que integran los dispositivos PIC16F88X es la posibilidad de
controlar su funcionamiento mediante eventos externos ajenos a él. Es decir, la temporización y/o cuenta se
puede detener o reanudar mediante una señal de disparo (GATE). Dicha señal puede aplicarse
externamente, mediante la línea RB5/T1G, o bien la puede generar la salida del comparador C2 integrado
en el PIC. En este ejemplo vamos a usar la señal de disparo aplicada externamente por la patilla RB5/T1G.

Como en el ejemplo anterior, la pantalla LCD visualizará en binario la evolución del Timer 1 con el
número de pulsos que le entran. Esa cuenta la puedes detener y/o reanudar mediante el interruptor E0 del
laboratorio que lo conectarás con la entrada RB5/T1G de disparo (GATE).

P-9.6.1 Descripción / Edición del programa fuente

Tras la secuencia de RESET se configuran las entradas y salidas, se borra el Timer 1 para iniciar la
cuenta desde 0 y se selecciona su modo de trabajo como contador de pulsos externos:

movlw b'11000011'
movwf T1CON ;Configura TMR1

Cuando se pone a nivel “1” el bit 6 del registro T1CON el sistema de control del Timer 1 por señal
externa de disparo 1 queda habilitado. Con el bit 7 de ese mismo registro se selecciona la polaridad.
Cuando se pone a “0” la señal de disparo en RB5/T1G debe estar a “0” para que el Timer 1 pueda
evolucionar. Si esa señal está a “1” el Timer 1 queda detenido. Si ese mismo bit se pone a “1”, como en el
ejemplo, la señal de disparo en RB5/T1G debe estar a “1” para que el Timer evolucione. Si está a “0” el
Timer se detiene.

9-27
www.mkelectronica.com Microcontroladores PIC: Nivel I
Una vez inicializada la pantalla LCD, el cuerpo del programa principal se limita a leer la parte alta del
Timer 1 (TMTR1H) y la parta baja (TMR1L) con el estado actual de la cuenta, para visualizarlo sobre la
pantalla LCD mediante la rutina “Visualiza”. Esta rutina convierte los bits “0” y “1” en sus correspondientes
caracteres ASCII y los envía a la pantalla. Es igual a la del ejemplo anterior.

P-9.6.2 Montaje eléctrico

Lo tienes en la figura y es idéntico al del ejemplo anterior. Únicamente se ha añadido el interruptor


E0 conectado con la entrada RB5/T1G para el control externo del Timer.

PANTALLA LCD
1Hz
F.OUT.
10Hz
2X16 RC0/T1CKI

SYM10
100Hz RB5/T1G
1KHz
R/W
RS

D0
D1
D2
D3
D4
D5
D6
D7
E
4
5
6

7
8
9
10
11
12
13
14

G. LOGICO
RB3
RB2
RB1
RB0

E7

E6

E5

E4

E3

E2

E1

E0
RA1
RA2
S7

S6

S5

S4

S3

S2

S1

S0
RA3

SALIDAS DIGITALES E. DIGITALES

P-9.6.3 Grabación del dispositivo y comprobaciones finales

Una vez realizadas las conexiones, grabado el PIC y alimentado el sistema, basta comprobar que
en la pantalla LCD nos aparece un número binario de 16 bits que representa el valor actual del Timer 1
como contador. Este número se va incrementando con cada pulso de entrada procedente del generador
lógico del laboratorio.

Cada vez que el interruptor E0 se pone a nivel “0” la cuenta se detiene. Cuando lo pones de nuevo a
nivel “1” la cuenta se reanuda. ¡Atención! Observa que este control es totalmente automático y por
hardware. El controlador no interviene para nada ni ejecuta ninguna instrucción al respecto.

P-9.6.4 Ahora tú

Tal y como has estudiado en el área de teoría, el Timer 1 en el modo contador se incrementa con
los flancos ascendentes de los pulsos externos. Esto lo puedes comprobar fácilmente observando el led S0
que monitoriza la señal del generador. El incremento del contador se produce justo cuando el led se activa.

La frecuencia del generador del laboratorio la puedes variar en cuatro valores distintos: 1 Hz, 10 Hz,
100 Hz y 1 KHz. Lógicamente esto afectará a la velocidad con la que evoluciona el Timer 1.

Aunque solo sea por pura curiosidad, podrías modificar el programa para cambiar la polaridad de la
señal externa de disparo (GATE), haciendo que sea activa por nivel “0”. Comprueba luego el correcto
funcionamiento del programa.

P-9.7 EJEMPLO 9-7: El TMR1 como divisor de frecuencias

Debes saber que cualquier Timer trabajando en el modo contador lleva implícita una función
añadida: la división de frecuencias. Efectivamente, se puede hacer que el Timer cuente un determinado
número de pulsos y, al final de la cuenta, una señal de salida cambie de estado. La frecuencia de esa señal
de salida será igual a la frecuencia de entrada del contador dividida entre el número de pulsos a contar.

9-28
www.mkelectronica.com Microcontroladores PIC: Nivel I
Es lo que vas a hacer en este ejemplo. El Timer 1 actúa en el modo contador que provocará una
interrupción al finalizar la cuenta. El tratamiento de esa interrupción provocará un cambio de estado en la
salida RB0 conectada al led S0 del laboratorio. Un ciclo completo en RB0 precisa de dos cambios de estado
(0-1-0). La frecuencia de salida en RB0 será:

=
×

La frecuencia de entrada con los pulsos a contar procede del generador lógico del laboratorio USB-
PIC’School. Se puede ajustar a 1 Hz, 10 Hz, 100 Hz y 1 KHz.

P-9.7.1 Descripción / Edición del programa fuente

Tras la secuencia de RESET y la configuración de las entradas y salidas, se habilita la interrupción


del Timer 1 activando el bit TMR1IE en el registro PIE1. A continuación se ejecutan las siguientes
instrucciones:

movlw b'00000111'
movwf T1CON
movlw low ~Valor_N+1
movwf TMR1L
movlw high ~Valor_N
movwf TMR1H ;Carga el TMR1 con el valor a dividir
movlw b'11000000'
movwf INTCON ;Habilita interrupciones

El Timer 1 se configura como contador de eventos externos sensibles al flanco ascendente y


aplicados por la patilla RC0/T1CKI. A continuación se carga con el valor a contar (su complemento) y que se
encuentra definido en la constante “Valor_N” (10 en el ejemplo). Por último, mediante el registro INTCON,
se habilitan las interrupciones.

El programa principal coloca al controlador en el modo SLEEP de bajo consumo, del que sólo saldrá
al producirse una interrupción cuando el Timer 1 finaliza la cuenta.

El programa de tratamiento se limita a recargar el Timer 1 con el valor de la nueva cuenta, reponer
el bit TMR1IF del registro PIR1 y cambiar de estado la salida RB0. Al retornar desde la interrupción, el
controlador se vuelve a quedar en el modo SLEEP de bajo consumo.

¡Aviso! En esta ocasión sí que funciona el Timer 1 aunque el controlador se encuentre en el modo SLEEP.
Hay que tener en cuenta que está trabajando en el modo contador con fuente de reloj EXTERNA, asíncrona
e independiente del reloj del sistema.

1Hz
F.OUT.
P-9.7.2 Montaje eléctrico RC0/T1CKI
10Hz
SYM10

100Hz
1KHz
Su esquema se muestra en la figura. La salida del G. LOGICO
generador lógico se conecta con la entrada RC0/T1CKI.
Representa la frecuencia de entrada a dividir. Se conecta con SALIDAS DIGITALES

el led S7 para su monitorización.


S7

S6

S5

S4

S3

S2

S1

S0

La salida RB0 se conecta con el led S0. Un pulso


completo (0-1-0) representa la frecuencia de salida dividida.

RB0

9-29
www.mkelectronica.com Microcontroladores PIC: Nivel I
P-9.7.3 Grabación del dispositivo y comprobaciones finales

En el generador lógico elegimos una frecuencia de entrada de 1 Hz. En este ejemplo, el número de
pulsos a contar se establece en la constante “Valor_N” y es de 10. Se puede apreciar claramente que
cuando se aplican 10 pulsos de entrada, la salida RB0 cambia de estado. Con otros 10 pulsos la salida RB0
vuelve a cambiar. Es decir, hacen falta 20 pulsos de entrada para obtener un pulso de salida. Esto es tanto
como decir que la frecuencia de entrada se divide entre 20.

P-9.7.4 Ahora tú

En primer lugar puedes aumentar la frecuencia del generador a 10 Hz, 100 Hz y 1 KHz y comprobar
que la frecuencia en RB0 también aumenta. Si dispones de un osciloscopio o un frecuencímetro puedes
medir con exactitud la relación entre la frecuencia de entrada (la del generador) y la de salida (en RB0).
Verás que la de salida es igual a la de entrada dividida entre 20.

Puedes modificar la constante “Valor_N” del programa para realizar


F.del generador F. en RB0
1 Hz 0.05 Hz divisiones de frecuencia por diferentes factores. En este ejemplo
10 Hz 0.5 Hz podemos hablar de un divisor 1:20. Así en la siguiente tabla tienes una
100 Hz 5 Hz relación de la frecuencia de salida en la patilla RB0 según el valor de la
1 KHz 50 Hz frecuencia que proporciona el generador del laboratorio.

La división de frecuencias puede tener un gran número de aplicaciones prácticas: generación de


frecuencias y armónicos, generación de tonos, generación de patrones de tiempo (pensemos por ejemplo
que la frecuencia de red de 50 Hz dividida entre 50 nos proporciona 1 pulso por segundo), y un largo
etcétera. No pierdas de vista esta cualidad de los contadores. Seguro que en algún momento le encuentras
alguna utilidad.

P-9.8 EJEMPLO 9-8: Frecuencímetro

Otra aplicación directa del empleo de un Timer en el modo contador: el frecuencímetro. Tienes aquí
un ejemplo didáctico de lo que podría ser, con una mayor elaboración, una aplicación práctica real.

Un frecuencímetro es un instrumento capaz de medir la frecuencia de una señal. Esto no es otra


cosa que contar el número de pulsos que entran durante una unidad de tiempo. Por ejemplo, si durante 1
segundo contamos 125 pulsos, diremos que la frecuencia de la señal de entrada es de 125 Hz.

En el ejemplo vas a utilizar el Timer 1 en el modo contador para contar el número de pulsos que
entran por la patilla RC0/T1CKI. Por otra parte vas a emplear el Timer 0 en el modo temporizador para
controlar el tiempo en que se mantiene activa la cuenta.

El Timer 0 provocará una interrupción cada 10 mS. Cuando se produzcan 100 interrupciones habrá
pasado 1 segundo (0.01*100). En este instante se detiene la cuenta del Timer 1 y se visualiza sobre el LCD
el valor de la cuenta (la frecuencia en Hz).

P-9.8.1 Descripción / Edición del programa fuente

El Timer 0 se configura en el modo temporizador con un prescaler de 256. Se le carga con 39 (0x27)
para que, trabajando a 4 MHz (Fosc) y con ese prescaler, produzca una interrupción cada 10 mS (39 * 256).
Recuerda que el Timer 0 es un contador ascendente por lo que le debes cargar con el complemento de 39
(0xD8).

Una vez configurado el Timer 1 como contador y con un prescaler de 1:1, se activa la interrupción
del Timer 0 y se habilita la cuenta en el Timer 1. Comienza a contar los pulsos de entrada.

9-30
www.mkelectronica.com Microcontroladores PIC: Nivel I
Transcurridos 10 mS el Timer 0 provoca una interrupción. Cuando se hayan producido 100
interrupciones habrá transcurrido un segundo. En ese momento se detiene la cuenta en el Timer 1, se lee su
resultado y se visualiza sobre la pantalla LCD. La interrupción finaliza reponiendo ambos Timers para
comenzar así una nueva medida.

En este ejemplo cabe destacar la subrutina “Visualizar” y la subrutina “16Bits_BCD”. La primera se


encarga de convertir un número BCD de 5 dígitos en sus correspondientes caracteres ASCII para
visualizarlos sobre el LCD. La segunda se encarga de convertir un número binario de 16 bit (el valor de la
cuenta del Timer 1) en su equivalente BCD con 5 dígitos, desde 0 hasta 65535

El cuerpo del programa principal consiste en un bucle infinito.

P-9.8.2 Montaje eléctrico

Es el de la figura. Representa el clásico interface con la pantalla LCD y la conexión entre la salida
del generador y la entrada RC0/T1CKI de nuestro frecuencímetro
PANTALLA LCD

2X16 F.OUT.
1Hz
10Hz
RC0/T1CKI

SYM10
100Hz
R/W
RS

D0
D1
D2
D3
D4
D5
D6
D7

1KHz
E
4
5
6

7
8
9
10
11
12
13
14

G. LOGICO
RB3
RB2
RB1
RB0

RA1
RA2
RA3

P-9.8.3 Grabación del dispositivo y comprobaciones finales

Emplea el generador lógico del laboratorio USB-PIC’School para aplicar a nuestro circuito una señal
con diferentes frecuencias. Puedes emplear cualquier otro tipo de generador siempre y cuando suministre
una señal de onda cuadrada de 5 V.

La pantalla LCD mostrará un valor numérico que representa, en Hz, la frecuencia de la señal de
entrada.

P-9.8.4 Ahora tú

Desde luego debes considerar que éste es un ejemplo puramente didáctico. Se ha tratado de
simplificar con objeto de hacerlo lo más legible posible a costa de perder exactitud y funcionalidad. Aquí es
donde tú puedes mejorarlo, la idea principal ya la tienes. Te doy unas pistas.

En este ejemplo tomamos una muestra del Timer 1 cada segundo. Como el Timer 1 es de 16 bits,
sólo podrá contar hasta 65.535 pulsos (o Hz). Sin embargo, puedes variar el tiempo de muestreo. Si haces
un muestreo cada 0,1 seg. y al número contado por el Timer 1 le multiplicas por 10, podrás medir hasta
655.350 pulsos (o Hz).

También puedes jugar con el prescaler del Timer 1. Al valor medido lo deberás multiplicar por el
prescaler elegido (1:1, 1:2, 1:4 o 1:8), pudiendo así medir rangos más altos de frecuencias. Esto también lo
puedes combinar con la reducción del tiempo de muestreo comentada anteriormente.

Por supuesto otro frente de trabajo puede estar en el interface con el usuario. Puedes usar el
teclado o los interruptores para establecer escalas de medidas. También puedes visualizar las unidades de
la frecuencia en Hz, KHz o MHz. O bien calcular y visualizar los periodos de la señal en S, mS o µS.

9-31
www.mkelectronica.com Microcontroladores PIC: Nivel I
En fin, ya ves que tienes muchas posibilidades. Ésta es la clásica aplicación que se presta a todo
tipo de modificaciones y mejoras.

P-9.9 EJEMPLO 9-9: Interrupción periódica con el TMR2

Vas a experimentar con el último de los temporizadores de los dispositivos PIC16F88X, el Timer 2.
Se trata de un Timer que, como novedad, dispone tanto de un prescaler como de un postcaler, así como de
un registro de periodos PR2 que permite la recarga automática del propio Timer cada vez que finaliza una
cuenta.

Este Timer 2 tiene una relevancia especial cuando se emplea con los módulos CCP para generar
señales PWM moduladas en anchura. Esto lo podrás estudiar más adelante bien por tu cuenta o bien en
otro curso más avanzado. De momento lo vas a emplear como si de un temporizador más se tratara.

En este caso va a producir una interrupción cada 10 mS. Cuando se produzcan 100 interrupciones
habrá transcurrido 1 segundo (100*0.01). Sobre los displays del laboratorio USB-PIC’School se visualizan, a
modo de segundero, los segundos transcurridos.

P-9.9.1 Descripción / Edición del programa fuente

El registro de periodos establece el valor de la temporización a realizar por el Timer 2. Se le carga


con 39 (0x27). A este Timer se le configura para trabajar con un prescaler 1:16 y un postcaler también de
1:16. La fuente de reloj empleada por el Timer 2 es siempre la del sistema (Fosc/4 o 4Tosc). Si sabemos
que esta frecuencia es de 4 MHz, el Timer se incrementa en una unidad cada 16 µS (4Tosc*16).

Partiendo de 0, el Timer 2 avanza hasta alcanzar el valor del registro de periodos PR2 (39). En ese
momento habrán transcurrido 624 µS (16 µS*39). El postcaler se incrementa en una unidad, el Timer 2 se
pone a 0 y se reanuda así una nueva cuenta hasta 39.

Cuando se alcanza el valor seleccionado en el postcaler (1:16), se producirá la interrupción. Esto


ocurre cada 9.984 µS (624 µS*16), es decir, cada 9,98 mS.

El programa de tratamiento espera a recibir un total de 100 interrupciones, lo que supone un tiempo
transcurrido de aproximadamente 1 segundo (9,98 mS*100). Se actualiza el contador de segundos.

Por su parte el programa principal se limita a visualizar sobre los displays el valor actual del
segundero.

Este ejemplo es una muestra más de la importancia de las interrupciones. Emplea los dos displays
de 7 segmentos para visualizar los segundos transcurridos. Sabemos que los displays se controlan
haciendo un barrido secuencial y constante sobre los mismos y que lo realiza la rutina “Visu_Disp”.

Al emplear la interrupción nuestro controlador dedica la mayor parte del tiempo a ejecutar
constantemente esa rutina, con lo que los displays se iluminan perfectamente. Sólo cuando hay una
interrupción, cada 10 mS, el controlador abandona el barrido durante un breve espacio de tiempo para
atenderla, pero esto no afecta de forma apreciable a la visualización.

9-32
www.mkelectronica.com Microcontroladores PIC: Nivel I
P-9.9.2 Montaje eléctrico 7 SEGMENTOS

a RB0
b RB1
Se muestra en la figura. Las salidas RB0:RB7 controlan c RB2
d RB3
los segmentos a:dp de los displays mientras que las salidas e RB4
RA2 y RA3 controlan los respectivos ánodos de las unidades y f
g
RB5
RB6
de las decenas. dp RB7

AC DEC AC UNI

.
RA2
RA3
P-9.9.3 Grabación del dispositivo y comprobaciones finales

Una vez realizadas las conexiones y grabado el controlador con el programa del ejemplo, basta con
observar que los displays visualizan un segundero.

P-9.9.4 Trabajo personal

Con objeto de familiarizarte con el Timer 2 te propongo que, seleccionando diferentes valores tanto
del prescaler como del postcaler, realices un cronómetro que mida los tiempos en diferentes unidades:
minutos, segundos (como en el ejemplo), décimas, centésimas, etc. Puedes utilizar las entradas digitales
(interruptores o pulsadores) para seleccionar el tipo de medida a realizar, y la pantalla LCD.

P-9.10 EJEMPLO 9-10: Entretenimiento, “Adivina el número”

Como último ejemplo de esta unidad y de este curso, voy a proponer un ejemplo práctico de
entretenimiento. Con él vas a manejar periféricos que ya has utilizado como son el teclado y la pantalla LCD
del laboratorio USB-PIC’School. También vas a emplear el Timer 0.

Consiste en adivinar un número aleatorio comprendido entre 00 y 99. Mediante la pantalla LCD y el
teclado se crea un interface de usuario muy sencillo que facilita el seguimiento del juego.

P-9.10.1 Descripción / Edición del programa fuente

El programa fuente de este proyecto es bastante largo pero no quiere decir que sea especialmente
complejo. La mayor parte de rutinas, sobre todo las destinadas al manejo del teclado y la pantalla, ya las
has empleado en anteriores ejemplos.

Quizá merezca la pena destacar el “truco” empleado para obtener un número aleatorio. Lo hacemos
ni más ni menos que mediante el Timer 0. Éste se encuentra en constante evolución. Trabajando a 4 MHz y
con un prescaler de 256, se incrementa cada 256 µS. Lo hace de forma constante y, cada vez que
desborda, reanuda una nueva cuenta.

En un momento dado el programa lee el valor actual del Timer 0 y a partir de él obtiene un valor
entre 00 y 99. Se entiende que es un número aleatorio dado que es imposible predecir el valor que tenía el
Timer en el instante en que se leyó. ¡Se está incrementando cada 256 µS!

A partir de aquí se sigue la mecánica propia del juego. Esperar que el usuario teclee un número,
consultar si es o no igual que el aleatorio, controlar el número de intentos, etc.

Si puedes tomarte la molestia y tratar de seguir el funcionamiento del programa, aprenderás


diferentes técnicas, rutinas y trucos que podrás usar en tus propios proyectos y aplicaciones.

9-33
www.mkelectronica.com Microcontroladores PIC: Nivel I
P-9.10.2 Montaje eléctrico

Se corresponde con el esquema de la figura. Es el clásico interface con el teclado y la pantalla LCD
que ya hemos usado en múltiples ejemplos.
PANTALLA LCD

2X16

R/W
RS

D0
D1
D2
D3
D4
D5
D6
D7
E
8
F3
4
7
F2 1 2 3 ^
5
6

7
8
9
10
11
12
13
14
6
5 F1
F0
4 4 5 6
^
3 C3
2 C2
C1
1
C0 7 8 9 >

* 0 # <

TECLADO4X4
RB0
RA3
RA2
RA1

RB1
RB2
RB3
RB4
RB5
RB6
RB7
P-9.10.3 Comprobaciones finales

Basta que realices el montaje y grabes el controlador con el ejemplo. Inmediatamente, como se
muestra en la fotografía de la figura, podrás empezar a jugar. ¡Suerte!

P-9.10.4 Trabajo personal

Este ejemplo se puede ver sujeto a múltiples modificaciones. Se me ocurre que puedes variar el
número de intentos para acertar el número. También puedes cambiar el juego en sí mismo. Prueba a
emular, por ejemplo, una partida de dados.

Quizá también te apetezca realizar un circuito a medida para implementar este (u otro) juego y
llevarlo de forma autónoma para lucirte ante tus familiares y amigos. Algo parecido se propuso en el
apartado P-5.8 de la Unidad 5. Sírvete de los esquemas de montaje correspondientes.

9-34
www.mkelectronica.com Microcontroladores PIC: Nivel I
Guía rápida de referencias

3.- El juego de instrucciones

En las siguientes tablas tienes el juego completo de instrucciones. En cada columna se describe:

 NEMONICO: Es la abreviatura de la instrucción, así como los operandos que precisa


(f=registro, d=destino, b=nº de bit y k=constante).
 DESCRIPCIÓN: Una breve explicación de cada instrucción.
 CICLOS: Indica el número de ciclos que consume la ejecución de cada instrucción. Observa
que la mayoría consumen 1 ciclo, excepto las de salto incondicional que consumen 2. Las
de salto condicional pueden consumir 1 ciclo si NO se produce el salto, y 2 ciclos si se
produce.
 OP CODE: Muestra el código binario que define a cada instrucción. Entre ese código y los
posibles operandos, todas las instrucciones están formadas por 14 bits.
 STATUS: Indica qué bits del registro STATUS se pueden ver modificados por la ejecución
de una instrucción determinada.
 NOTAS: Comentarios acerca de determinadas instrucciones.

INSTRUCCIONES INMEDIATAS
NEMÓNICO DESCRIPCIÓN CICLOS OP CODE STATUS NOTAS
ADDLW k Sumar al registro W la 1 11 111x kkkk kkkk C,DC,Z
constante k
ANDLW k Función AND entre W y la 1 11 1001 kkkk kkkk Z
constante k
IORLW k Función OR entre W y la 1 11 1000 kkkk kkkk Z
constante k
MOVLW k Cargar W con la constante 1 11 00xx kkkk kkkk
k
SUBLW k Resta a la constante k el 1 11 110x kkkk kkkk C,DC,Z
registro W
XORLW k Función XOR entre W y la 1 11 110x kkkk kkkk Z
constante k
CALL k Salto a subrutina en la 2 10 0kkk kkkk kkkk
dirección k
GOTO k Salto incondicional a la 2 10 1kkk kkkk kkkk
dirección k

INSTRUCCIONES ORIENTADAS A REGISTROS


NEMÓNICO DESCRIPCIÓN CICLOS OP CODE STATUS NOTAS
ADDWF f,d Sumar a W el contenido 1 00 0111 dfff ffff C,DC,Z 1,2
del registro f
ANDWF f,d Función AND entre W y el 1 00 0101 dfff ffff Z 1,2
registro f
CLRF f Borrar el registro f 1 00 0001 1fff ffff Z 2
COMF f,d Complemento a 1 del 1 00 1001 dfff ffff Z 1,2
registro f
DECF f,d Decrementar el registro f 1 00 0011 dfff ffff Z 1,2
en una unidad
DECFSZ f,d Decrementar f y saltar si 1 (2) 00 1011 dfff ffff 1,2,3
es igual a 0
INCF f,d Incrementar el registro f en 1 00 1010 dfff ffff Z 1,2
una unidad
INCFSZ f,d Incrementar f y saltar si es 1 (2) 00 1111 dfff ffff 1,2,3
igual a 0
IORWF f,d Función OR entre W y el 1 00 0100 dfff ffff Z 1,2
registro f

7
www.mkelectronica.com Microcontroladores PIC: Nivel I
Guía rápida de referencias

MOVF f,d Mover el registro f 1 00 1000 dfff ffff Z 1,2


MOVWF f Guardar el W en el registro 1 00 0000 1fff ffff
f
RLF f,d Rotación a la izquierda a 1 00 1101 dfff ffff C 1,2
través del C
RRF f,d Rotación a la derecha a 1 00 1100 dfff ffff C 1,2
través del C
SUBWF f,d Restar al registro f el valor 1 00 0010 dfff ffff C,DC 1,2
de W
SWAPF f,d Intercambiar nibbles del 1 00 1110 dfff ffff 1,2
registro f
XORWF f,d Función XOR entre W y el 1 00 0110 dfff ffff Z 1,2
registro f

INSTRUCCIONES ORIENTADAS AL BIT


NEMÓNICO DESCRIPCIÓN CICLOS OP CODE STATUS NOTAS
BCF f,b Borrar el bit b del registro f 1 01 00bb bfff ffff 1,2
BSF f,b Activar el bit b del registro 1 01 01bb bfff ffff 1,2
f
BTFSC f,b Chequea el bit b del 1 (2) 01 10bb bfff ffff 3
registro f y saltar si es “0”
BTFSS f,b Chequea el bit b del 1 (2) 01 11bb bfff ffff 3
registro f y saltar si es “1”

INSTRUCCIONES DE CONTROL
NEMÓNICO DESCRIPCIÓN CICLOS OP CODE STATUS NOTAS
CLRW Borrar el registro W 1 00 0000 0xxx xxx Z
CLRWDT Iniciar el temporizador 1 00 0000 0110 0100 /TO,/PD
WDT
NOP No operar 1 00 0000 0xx0 0000
RETFIE Retorno de interrupción 2 00 0000 0000 1001
RETLW k Retorno de subrutina con 2 11 01xx kkkk kkkk
una constante en W
RETURN Retorno de subrutina 2 00 0000 0000 1000
SLEEP Modo standby de bajo 1 00 0000 0110 0011 /TO,/PD
consumo

NOTAS:

1. Cuando una instrucción afecta a un registro que, a su vez, se corresponde con un puerto de E/S, el
valor empleado coincide con el valor lógico presente en las patillas físicas de E/S.
2. Cuando alguna instrucción afecta al registro correspondiente al temporizador Timer 0 Posición
0x01), se reinicia el preescaler si es que estuviera asociado a ese temporizador.
3. Si el contador de programa o PC se ve modificado por alguna instrucción de salto, esa instrucción
consume 2 ciclos.

8
www.mkelectronica.com Microcontroladores PIC: Nivel I
Guía rápida de referencia

4.- Las Puertas de E/S

La figura muestra la distribución de patillas de las diferentes Puertas de E/S del PIC16F886.

En las siguientes tablas tienes un resumen de todos los registros internos especiales (SFR)
destinados al control y configuración de las Puertas de entrada o salida.

4.1 La Puerta A

Nombre: PORTA (Puerta A) Dirección: 0x05 Banco: 0


R/W-x R/W-x R/W-x R/W-x R/W-x R/W-x R/W-x R/W-x
RA7 RA6 RA5 RA4 RA3 RA2 RA1 RA0

RA<7:0> Nivel lógico en cada patilla de E/S


1 = Patilla a nivel “1”
0 = Patilla a nivel “0”

Nombre: TRISA (Configuración de A) Dirección: 0x85 Banco: 1


R/W-1 R/W-1 R/W-1 R/W-1 R/W-1 R/W-1 R/W-1 R/W-1
(1) (2) (1) (2) (2) (2) (2) (2) (2) (2)
TRISA7 TRISA6 TRISA5 TRISA4 TRISA3 TRISA2 TRISA1 TRISA0

TRISA<7:0> Configuración individual para cada línea o patilla


1 = La patilla se configura como entrada en alta impedancia
0 = La patilla se configura como salida

NOTAS:

(1) Si se selecciona el oscilador tipo XT, HS o LP, los bits 6 y 7 de TRISA se leen siempre como nivel
“1”.
(2) Al conectar la alimentación o reiniciar el sistema, el registro TRISA se carga con todos los bits a “1”.
De esta forma todas las líneas de la puerta A, queden configuradas como entradas en alta
impedancia. Con esto se evita que ningún periférico de salida (p.e. un relé) se active de forma
descontrolada nada más alimentar el sistema.

9
www.mkelectronica.com Microcontroladores PIC: Nivel I
Guía rápida de referencia

Nombre: ANSEL (Selección Dirección: 0x188 Banco: 3


analógica)
R/W-1 R/W-1 R/W-1 R/W-1 R/W-1 R/W-1 R/W-1 R/W-1
(1) (2) (1) (2) (1) (2) (1) (1) (1) (1) (1)
ANS7 ANS6 ANS5 ANS4 ANS3 ANS2 ANS1 ANS0

ANS<7:0> Bits de selección de entradas analógicas


1 = Patilla de entrada analógica
0 = Patilla de E/S digital

NOTAS:

(1) Cuando una patilla se configura como entrada analógica, automáticamente se desconectan todas
las funcionalidades del circuito de entrada digital asociadas a esa patilla. El correspondiente bit en el
registro TRISA se debe configurar también como entrada.
(2) Estas patillas no están implementadas en los dispositivos PIC16F883/886, únicamente lo están en
los dispositivos PIC16F884/887 de 40 patillas.

4.2 La Puerta B

Nombre: PORTB (Puerta B) Dirección: x06 Banco: 0


R/W-x R/W-x R/W-x R/W-x R/W-x R/W-x R/W-x R/W-x
RB7 RB6 RB5 RB4 RB3 RB2 RB1 RB0

RB<7:0> Nivel lógico en cada patilla de E/S


1 = Patilla a nivel “1”
0 = Patilla a nivel “0”

Nombre: TRISB (Configuración de B) Dirección: 0x86 Banco: 1


R/W-1 R/W-1 R/W-1 R/W-1 R/W-1 R/W-1 R/W-1 R/W-1
TRISB7 TRISB6 TRISB5 TRISB4 TRISB3 TRISB2 TRISB1 TRISB0

TRISB<7:0> Configuración individual para cada línea o patilla


1 = La patilla se configura como entrada en alta impedancia
0 = La patilla se configura como salida

Nombre: ANSELH (Selec. Dirección: Banco: 3


analógica) 0x189
U-0 U-0 R/W-1 R/W-1 R/W-1 R/W-1 R/W-1 R/W-1
(1) (1) (1) (1) (1) (1)
---- ---- ANS13 ANS12 ANS11 ANS10 ANS9 ANS8

ANSH<7:6> No se emplean. Se leen como nivel “0”


ANSH<5:0> Bits de selección de entradas analógicas
1 = Patilla de entrada analógica
0 = Patilla de E/S digital o función especial

NOTAS:

(1) Cuando una patilla se configura como entrada analógica, automáticamente se desconectan todas
las funcionalidades del circuito de entrada digital asociadas a esa patilla (cargas pull-up e
interrupción por cambio de estado). El correspondiente bit en el registro TRISB se debe configurar
también como entrada.

10
www.mkelectronica.com Microcontroladores PIC: Nivel I
Guía rápida de referencia

Nombre: WPUB (Selec. Pull-up) Dirección: 0x95 Banco: 1


R/W-1 R/W-1 R/W-1 R/W-1 R/W-1 R/W-1 R/W-1 R/W-1
WPUB7 WPUB6 WPUB5 WPUB4 WPUB3 WPUB2 WPUB1 WPUB0

WPUB<7:0> Bits de activación de las resistencias de carga pull-up


1 = Resistencia de carga activada
0 = Resistencia de carga desactivada

Nombre: IOCB (Int. Por cambio) Dirección: 0x96 Banco: 1


R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0
IOCB7 IOCB6 IOCB5 IOCB4 IOCB3 IOCB2 IOCB1 IOCB0

IOCB<7:0> Bits de activación de las interrupciones por cambio de estado


1 = Interrupción por cambio de estado activada
0 = Interrupción por cambio de estado desactivada

4.3 La Puerta C

Nombre: PORTC (Puerta C) Dirección: 0x07 Banco: 0


R/W-x R/W-x R/W-x R/W-x R/W-x R/W-x R/W-x R/W-x
RC7 RC6 RC5 RC4 RC3 RC2 RC1 RC0

RC<7:0> Nivel lógico en cada patilla de E/S


1 = Patilla a nivel “1”
0 = Patilla a nivel “0”

Nombre: TRISC (Configuración de C) Dirección: 0x87 Banco: 1


R/W-1 R/W-1 R/W-1 R/W-1 R/W-1 R/W-1 R/W-1 R/W-1
TRISC7 TRISC6 TRISC5 TRISC4 TRISC3 TRISC2 TRISC1 (1) TRISC0 (1)

TRISC<7:0> Configuración individual para cada línea o patilla


1 = La patilla se configura como entrada en alta impedancia
0 = La patilla se configura como salida

NOTAS:

(1) Estos bits se leen siempre a “0” al seleccionar un oscilador del tipo LP para el Timer 1

4.4 La puerta E

Nombre: PORTE (Puerta E) Dirección: 0x09 Banco: 0


U-0 U-0 U-0 U-0 R-x R/W-x R/W-x R/W-x
---- ---- ---- ---- RE3 RE2 RE1 RE0

RE<7:4> No implementados, se leen siempre a “0”


RE<3:0> Nivel lógico en cada patilla de E/S
1 = Patilla a nivel “1”
0 = Patilla a nivel “0”

11
www.mkelectronica.com Microcontroladores PIC: Nivel I
Guía rápida de referencia

Nombre: TRISE Dirección: 0x89 Banco: 1


(Configuración de PORTE)
U-0 U-0 U-0 U-0 R-1 (1) R/W-1 R/W-1 R/W-1
---- ---- ---- ---- TRISE3 TRISE2 TRISE1 TRISE0

TRISE<7:4> No implementados, se leen siempre a “0”


TRISE<3:0> Configuración individual para cada línea o patilla
1 = La patilla se configura como entrada en alta impedancia
0 = La patilla se configura como salida

NOTAS:

(1) TRISE<3> sólo se puede leer (un “1”) ya que la patilla RE3 únicamente actúa como entrada

12
www.mkelectronica.com Microcontroladores PIC: Nivel I
Guía rápida de referencia

5.- Circuitos auxiliares

5.1 Palabra de configuración CONFIG1

Cuando el PIC está borrado todos sus bits se ponen a “1”. Es el valor por defecto.

---- ---- /DEBUG LVP FCMEN IESO BOREN1 BOREN0


Bit 15 Bit 8

/CPD /CP MCLR /PWRTE WDTE FOSC2 FOSC1 FOSC0


Bit 7 Bit 0

Bits 15-14 No implementados, se leen como “1”


Bit 13 /DEBUG: Modo de depuración en circuito (ICD)
1 = Depurador desconectado. Las líneas RB6/ICSPCLK y RB7/ICSPDAT actúan
como líneas de E/S
0 = Depurador conectado. Las líneas RB6/ICSPCLK y RB7/ICSPDAT se destinan
al depurador
Bit 12 LVP: Grabación con bajo voltaje
1 = RB3/PGM actúa como PGM, habilitación de grabación en bajo voltaje
0 = RB3 actúa como E/S digital.
Bit 11 FCMEN: a monitorización del reloj
1 = Monitorización activada
0 = Monitorización desactivada
Bit 10 IESO: Bit para la conmutación del reloj
1 = La conmutación de reloj interno/externo habilitada
0 = La conmutación de reloj interno/externo deshabilitada
Bit 9-8 BOREN<1:0>: Selección del Brown-out Reset (Reset por fallo de
alimentación)
11 = El sistema Brown-out Reset (BOR) activado
10 = BOR activado durante la ejecución y desactivado en el modo standby de
bajo consumo (SLEEP)
01 = El BOR se controla por software, mediante el bit SBOREN del registro
PCON
00 = El sistema BOR se desactiva
Bit 7 /CPD: Protección de la memoria EEPROM de datos
1 = Protección deshabilitada
0 = Protección habilitada
Bit 6 /CP: Protección de la memoria FLASH de programa
1 = Protección deshabilitada
0 = Protección habilitada
Bit 5 MCLR: Configuración de la patilla RE3/MCLR
1 = RE3/MCLR actúa como MCLR (Reset)
0 = RE3/MCLR actúa como entrada digital RE3. MCLR se conecta internamente
a Vdd
Bit 4 /PWRTE: Activación del temporizador Power-Up (PWRT) al conectar la
alimentación
1 = PWRT desactivado
0 = PWRT activado
Bit 3 WDT: Activación del supervisor o watchdog WDT
1 = WDT activado
0 = WDT desactivado. Puede activarse por software mediante el bit SWDTEN del
registro WDTCON

13
www.mkelectronica.com Microcontroladores PIC: Nivel I
Guía rápida de referencia

Bit 2-0 FOSC<2:0>: Selección del tipo de oscilador


111 = Oscilador RC. Salida CLKOUT por RA6 y red RC conectada a la entrada RA7
110 = Oscilador RCIO. RA6 E/S digital, RA7 entrada desde la red RC
101 = Oscilador interno INTOSC. RA6 salida CLKOUT y RA7 E/S digital
100 = Oscilador interno INTOSCIO. Las líneas RA6 y RA7 actúan como E/S digitales
011 = Oscilador externo EC. RA7 es E/S digital y RA7 entrada CLKIN del reloj externo
010 = Oscilador HS de alta velocidad. Entre RA6 y RA6 se conecta un cristal o un resonador
001 = Oscilador XT estándar. Entre RA6 y RA6 se conecta un cristal o un resonador
000 = Oscilador LP de bajo consumo. Entre RA6 y RA6 se conecta un cristal.

5.2 Palabra de configuración CONFIG2

Cuando el PIC está borrado todos sus bits se ponen a “1”. Es el valor por defecto.

---- ---- ---- ---- ---- WRT1 WRT0 BOR4V


Bit 15 Bit 8

---- ---- ---- ---- ---- ---- ---- ----


Bit 7 Bit 0

Bits 15-11 No implementados, se leen como “1”


Bit 10-9 WRT<1:0>: Protección de escritura sobre la memoria Flash de programa
Modelos PIC16F883/PIC16F884
00 = Protegido desde 0x0000-0x07FF, desde 0x0800-0x0FFF puede modificarse
mediante EECON
01 = Protegido desde 0x0000-0x03FF, desde 0x0400-0x0FFF puede modificarse
mediante EECON
10 = Protegido desde 0x0000-0x00FF, desde 0x0100-0x0FFF puede modificarse
mediante EECON
11 = Se permite la escritura en la totalidad de la memoria flash de programa.
Modelos PIC16F886/PIC16F887
00 = Protegido desde 0x0000-0x0FFF, desde 0x1000-0x1FFF puede modificarse
mediante EECON
01 = Protegido desde 0x0000-0x07FF, desde 0x0800-0x1FFF puede modificarse
mediante EECON
10 = Protegido desde 0x0000-0x00FF, desde 0x0100-0x1FFF puede modificarse
mediante EECON
11 = Se permite la escritura en la totalidad de la memoria flash de programa.
Modelo PIC16F882
00 = Protegido desde 0x0000-0x03FF, desde 0x0400-0x07FF puede modificarse
mediante EECON
01 = Protegido desde 0x0000-0x00FF, desde 0x0100-0x07FF puede modificarse
mediante EECON
11 = Se permite la escritura en la totalidad de la memoria flash de programa.
Bit 8 BOR4V: Valor del Brown-out Reset que provoca el RESET si la tensión cae
por debajo de…
0 = Valor del BOR ajustado a 2.1V
1 = Valor del BOR ajustado a 4.0V
Bit 7-0 No implementados. Se leen como “1”

14
www.mkelectronica.com Microcontroladores PIC: Nivel I
Guía rápida de referencia

5.3 El registro de control del oscilador

Permite seleccionar los diferentes modos de trabajo del oscilador interno, para ajustar la frecuencia
general de trabajo del sistema. También permite conocer el estado o “calidad” de las frecuencias generadas
por dicho oscilador.

NOMBRE: OSCCON (Control y estado del módulo DIR.: 0x8F BANCO: 1


oscilador)
U-0 R/W-1 R/W-1 R/W-0 R-1 R-0 R-0 R/W-0
---- IRCF2 IRFC1 IRFC0 OSTS HTS LTS SCS

Bit 7 No implementado, se lee como “0”


Bit 6-4 IRFC<2:0>: Selección de frecuencia de trabajo del oscilador interno
111 = 8 MHz
110 = 4 MHz (por defecto)
101 = 2 MHz
100 = 1 MHz
011 = 500 KHz
010 = 250 KHz
001 = 125 KHz
000 = 31 KHz (LFINTOSC)
Bit 3 OSTS: Estado del sistema de arranque (Start-up Time)
1 = El dispositivo está ejecutando instrucciones en base al oscilador definido
por FOSC<2:0> de la palabra de configuración CONFING1
0 = El dispositivo está ejecutando en base al oscilador interno (el HFINTOSC o el
LFINTOSC)
Bit 2 HTS: Bit de estado del oscilador interno HFINTOSC (frecuencias desde 125 KHz
hasta 8 MHz)
1 = El oscilador interno HFINTOSC está estable
0 = El oscilador interno HFINTOSC no está estabilizado
Bit 1 LTS: Bit de estado del oscilador interno LFINTOSC (frecuencia 31 KHz)
1 = El oscilador interno LFINTOSC está estable
0 = El oscilador interno LFINTOSC no está estable
Bit 0 SCS: Selección del sistema de reloj
1 = El sistema de reloj emplea el oscilador interno
0 = El sistema de reloj emplea el oscilador definido por los bits FOSC<2:0> de la palabra
de configuración CONFIG1

5.4 El registro OSCTUNE

La frecuencia de salida del oscilador interno HFINTOSC está calibrada de fábrica a 8 MHz.
Mediante el registro OSCTUNE se puede modificar ligeramente el valor de esa frecuencia. Para ello se
introduce un valor de 5 bits en complemento a 2’s. Por defecto este valor es 0 y coincide con la calibración
de fábrica a 8 MHz.

NOMBRE: OSCTUNE (Calibración del oscilador interno DIR.: 0x90 BANCO: 1


HFINTOSC)
U-0 U-0 U-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0
---- ---- ---- TUN4 TUN3 TUN2 TUN1 TUN0

15
www.mkelectronica.com Microcontroladores PIC: Nivel I
Guía rápida de referencia

Bits 7-5 No implementados, se leen como “0”


Bit 4-0 TUN<4:0>: Bits de sintonía de frecuencia
01111 = Máxima frecuencia
01110 =
----
----
00001 =
00000 = Valor de calibración de fábrica a 8 MHz
11111 =
----
----
10000 = Mínima frecuencia

5.5 El registro WDTCON

Permite habilitar o no por software al circuito supervisor o watchdog (WDT). También ajusta el valor
del preescaler con objeto de aumentar o disminuir los tiempos de desbordamiento. Se complementa con el
registro OPTION_REG.

NOMBRE: WDTCON (Registro de control del supervisor WDT) DIR.: 0x105 BANCO: 2
U-0 U-0 U-0 R/W-0 R/W-1 R/W-0 R/W-0 R/W-0
---- ---- ---- WDTPS3 WDTPS2 WDTPS1 WDTPS0 SWDTEN

Bits 7-5 No implementados, se leen como “0”


Bit 4-1 WDTPS<3:0>: Ajuste del preescaler de 16 bits del supervisor del WDT
0000 = 1:32
0001 = 1:64
0010 = 1:128
0011 = 1:256
0100 = 1:512 (valor por defecto tras el RESET)
0101 = 1:1024
0110 = 1:2048
0111 = 1:4096
1000 = 1:8192
1001 = 1:16384
1010 = 1:32768
1011 = 1:65536
11xx = Reservado
Bit 0 SWDTEN: Activación por software del WDT
1 = Supervisor WDT activado
0 = La activación del WDT depende del bit WDTE de la palabra CONFIG1 de
configuración

5.6 El registro de control de potencia PCON

Entre otros, dispone de dos bits de estado que permiten determinar el tipo de RESET que se ha
producido. También permite o no activar por software el circuito BOR.

NOMBRE: PCON (Registro de control de potencia) DIR.: 0x8E BANCO: 1


U-0 U-0 R/W-0 R/W-1 U-0 U-0 R/W-0 R/W-x
---- ---- ULPWUE SBOREN ---- ---- /POR /BOR

16
www.mkelectronica.com Microcontroladores PIC: Nivel I
Guía rápida de referencia

Bits 7-5 No implementados, se leen como “0”


Bit 5 ULPWUE: Activación del “despertar” desde el modo SLEEP empleando la patilla
RA0 de bajo consumo
1 = Despertar en bajo consumo desde RA0 activado
0 = Despertar en bajo consumo desde RA0 desactivado
Bit 4 SBOREN: Activación del BOR por software (si los bits BOREN<1:0> de la palabra
de configuración CONFIG1=01)
1 = BOR activado
0 = BOR desactivado
Bits 3-2 No implementados, se leen como “0”
Bit 1 /POR: Bit de estado de la conexión de alimentación Power-on Reset (POR)
1 = No ha habido conexión de alimentación Power-on Reset (POR)
0 = Ha habido conexión de alimentación (POR)
Bit 0 /BOR: Bit de estado del circuito de detección de caídas de tensión Brown-
out Reset (BOR)
1 = No se ha detectado caída de tensión Vdd
0 = Se ha detectado caída de tensión Vdd y se ha generado RESET

17
www.mkelectronica.com Microcontroladores PIC: Nivel I
Guía rápida de referencia

18
www.mkelectronica.com Microcontroladores PIC: Nivel I
Guía rápida de referencia

6.- Memorias EEPROM/FLASH y las interrupciones


6.1 Los registros EEADR y EEADRH de direccionamiento

Permiten seleccionar la
dirección de la memoria
EEPROM y/o FLASH sobre la
que se va a leer o escribir.
EEADR contiene los 8 bits de
menos peso de la dirección.
Suficiente para direccionar la
8
EEPROM (2 =256 posiciones).
EEADRH contiene los 5 bits de
más peso de la dirección.
Necesario para direccionar la
5+8 13
FLASH (2 =2 =8192
posiciones).

NOMBRE: EEADR (Registro de direcciones para la EEPROM y DIR.: 0x10D BANCO: 2


la FLASH)
R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0
EEADR7 EEADR6 EEADR5 EEADR4 EEADR3 EEADR2 EEADR1 EEADR0

NOMBRE: EEADRH (Registro de direcciones para la DIR.: 0x10F BANCO: 2


FLASH)
U-0 U-0 U-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0
---- ---- ---- EEADR12 EEADR11 EEADR10 EEADR9 EEADR8

6.2 Los registros EEDAT y EEDATH de datos

Contienen los datos que se transfieren


hacia/desde las memorias EEPROM / FLASH.
EEDAT contiene los 8 bits de menos peso del
dato, suficiente para la memoria EEPROM (256 x
8). EEDATH contiene los 6 bits de más peso,
necesarios para formar las palabras de 14 bits
que precisa la memoria FLASH (8192 x 14).

NOMBRE: EEDAT (Registro de datos para la EEPROM y la DIR.: 0x10C BANCO: 2


FLASH)
R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0
EEDAT7 EEDAT6 EEDAT5 EEDAT4 EEDAT3 EEDAT2 EEDAT1 EEDAT0

NOMBRE: EEDATH (Registro de datos para la FLASH) DIR.: 0x10E BANCO: 2


U-0 U-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0
---- ---- EEDAT13 EEDAT12 EEDAT11 EEDAT10 EEDAT9 EEDAT8

19
www.mkelectronica.com Microcontroladores PIC: Nivel I
Guía rápida de referencia

6.3 Los registros EECON1 y EECON2

Mediante el registro EECON1 mostrado a continuación, se controlan todas las operaciones relativas
a la lectura/escritura tanto de la memoria EEPROM de datos como de la memoria FLASH de programa.

NOMBRE: EECON1 (Registro de control Nº 1 para la DIR.: 0x18C BANCO: 3


lectura/escritura de las memorias EEPROM/FLASH)
R/W-x U-0 U-0 U-0 R/W-x R/W-0 R/S-0 R/S-0
EEPGD ---- ---- ---- WRERR WREN WR RD

Bit 7 EEPGD: Selecciona el tipo de memoria a emplear


1 = Acceso a la memoria FLASH de programa
0 = Acceso a la memoria EEPROM de datos
Bit 6-4 No implementados, se leen a nivel “0”
Bit 3 WRERR: Bit de error en la escritura
1 = El ciclo de escritura ha finalizado prematuramente (causado por cualquier tipo
de RESET)
0 = El ciclo de escritura se ha completado correctamente
Bit 2 WREN: Bit de habilitación del ciclo de escritura
1 = Permite los ciclos de escritura
0 = Ciclos de escritura no permitidos
Bit 1 WR: Control de escritura
1 = Inicia un nuevo ciclo de escritura. Se pone a “0” automáticamente al finalizar
0 = Ciclo de escritura finalizado
Bit 0 RD: Control de lectura
1 = Inicia un nuevo ciclo de lectura. Se pone a “0” automáticamente al finalizar
0 = Ciclo de lectura finalizado o no iniciado.

EECON2 es un registro ficticio que se usa exclusivamente en la secuencia establecida por


Microchip para los ciclos de escritura. Se muestra a continuación y su lectura devuelve el valor “0”.

NOMBRE: EECON2 (Registro de control Nº 2 para la DIR.: 0x18D BANCO: 3


escritura de las memorias EEPROM/FLASH)
-0 -0 -0 -0 -0 -0 -0 -0
---- ---- ---- ---- ---- ---- ---- ----

6.4 Interrupciones

1. En un arranque normal, tras la conexión de alimentación,


se produce el RESET. El PC se carga con 0x0000 (vector
de RESET) y ejecuta la instrucción “GOTO Inicio”.
2. A partir de este punto comienza la ejecución del programa
de aplicación o “Programa principal”.
3. En un momento determinado se produce una interrupción
solicitada por algún periférico.
4. Se termina de ejecutar la instrucción en curso (PC=X). El
valor actual del PC más uno, se salva sobre la memoria de
stack.
5. El PC se carga con 0x0004 (Vector de interrupción).
6. Se ejecuta la instrucción “GOTO Inter”.
7. Comienza la ejecución del programa de tratamiento de la
interrupción.
8. Dicho programa debe finalizar con la instrucción de retorno
“RETFIE”.
9. Esa instrucción implica recuperar desde la memoria de
stack, el valor del PC+1. Se reanuda así la ejecución del
programa principal desde donde se abandonó.

20
www.mkelectronica.com Microcontroladores PIC: Nivel I
Guía rápida de referencia

6.5 El registro INTCON

Contiene los bits de estado (F) y de habilitación de interrupción (E) del temporizador Timer 0, de la
interrupción externa por RB0/INT y de la interrupción por cambio de estado en las patillas RB0:RB7.
También permite establecer el permiso de interrupción para el resto de los periféricos disponibles en el
controlador (PEIE), así como el permiso global para todas ellas (GIE).

NOMBRE: INTCON (Registro de control de interrupciones) DIR.: 0x0B BANCO:


Todos
R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-x
GIE PEIE T0IE INTE RBIE TOIF INTF RBIF

Bit 7 GIE: Permiso global de interrupciones


1 = Admite aquellas interrupciones que, individualmente, estén habilitadas
0 = No admite ninguna interrupción
Bit 6 PEIE: Permiso de interrupción para el resto de periféricos
1 = Admite aquellas interrupciones del resto de periféricos que estén habilitadas
0 = No admite ninguna interrupción procedente del resto de los periféricos
Bit 5 T0IE: Habilitación de la interrupción del temporizador Timer 0 cuando se
desborde
1 = Permite la interrupción del Timer 0
0 = No permite la interrupción del Timer 0
Bit 4 INTE: Habilitación de la interrupción externa por la patilla RB0/INT
1 = Permite la interrupción externa
0 = No permite la interrupción externa
Bit 3 RBIE: Habilitación de interrupción por cambio de estado en cualquiera de
las líneas RB0:RB7 (1)
1 = Permite la interrupción por cambio de estado
0 = No permite la interrupción por cambio de estado
Bit 2 T0IF: Bit de estado del temporizador Timer 0 (2)
1 = El Timer 0 se ha desbordado (debe borrarse por software)
0 = El Timer 0 no se ha desbordado
Bit 1 INTF: Bit de estado de la interrupción externa por RB0/INT
1 = Se ha recibido señal de interrupción por RB0/INT (debe borrarse por
software)
0 = No se ha recibido señal de interrupción externa
Bit 0 RBIF: Bit de estado de las interrupciones por cambio de estado
1 = Se ha detectado un cambio de estado en las líneas RB0:RB7 (debe borrarse
por software)
0 = No se ha detectado ningún cambio de estado

NOTAS:

1. La habilitación individual de interrupción por cambio de estado para cada una de las líneas
RB0:RB7 de la puerta B, se debe realizar mediante el registro IOCB que se presentó en el apartado
T-5.3.2.3 de la Unidad 5.

2. El bit de estado T0IF se activa cada vez que el Timer 0 se desborde y pase a valer 0x00. Durante la
secuencia de RESET, este temporizador no se modifica, por lo que deberá inicializarse antes de
borrar este bit.

21
www.mkelectronica.com Microcontroladores PIC: Nivel I
Guía rápida de referencia

6.6 Los registros PIR1 y PIE1

PIR1 refleja el estado actual de parte de los restantes periféricos disponibles en el controlador. Se han
resaltado los bits que afectan a aquellos periféricos que se estudian en este curso:

NOMBRE: PIR1 (Registro de estado de los periféricos nº 1) DIR.: 0x0C BANCO: 0


U-0 R/W-0 R-0 R-0 R/W-0 R/W-0 R/W-0 R/W-0
---- ADIF RCIF TXIF SSPIF CCP1IF TMR2IF TMR1IF

Bit 7 No está implementado. Se lee a “0”


Bit 6 ADIF: Bit de estado del conversor AD
1 = Ha finalizado una conversión AD (debe borrarse por software)
0 = La conversión no ha finalizado o no se ha iniciado
Bit 5 RCIF: Bit de estado del receptor del USART
1 = El buffer de recepción está completo, se ha recibido un carácter (se borra al leerlo
desde el registro RCREG)
0 = El buffer de recepción no está completo
Bit 4 TXIF: Bit de estado del transmisor del USART
1 = El buffer de transmisión está vacío, se ha transmitido un carácter (se borra al escribir
un nuevo carácter en el registro TXREG)
0 = El buffer de transmisión no está vacío
Bit 3 SSPIF: Bit de estado del módulo MSSP de comunicaciones serie síncronas
1 = Se ha producido una condición de interrupción (se debe borrar por software):
Modo SPI
Se ha realizado una transmisión/recepción
Modo I2C Master/Esclavo
Se ha realizado una transmisión/recepción
Modo Master:
Se ha realizado la condición de inicio (start)
Se ha realizado la condición de stop
Se ha realizado la condición de reinicio
Se ha realizado la condición ACK
0 = No se ha producido ninguna condición de interrupción
Bit 2 CCP1IF: Bit de estado del módulo CCP1
Modo Captura
1 = Se ha capturado el valor del Timer 1 (debe borrarse por software)
0 = No se ha capturado el valor del Timer 1
Modo Comparación
1 = El valor del Timer 1 coincide con el valor del registro de comparación (se
debe borrar por software)
0 = El valor del Timer 1 no coincide con el valor del registro de comparación
Modo PWM
No se usa en este modo
Bit 1 TMR2IF: Bit de estado del Timer 2
1 = El Timer 2 coincide con el contenido del registro de periodos PR2 (debe borrarse por
software)
0 = El Timer 2 no coincide con el registros de periodos PR2
Bit 0 TMR1IF: Bit de estado del Timer 1
1 = El temporizador Timer 1 se ha desbordado (se debe borrar por software)
0 = El temporizador Timer 1 aún no se ha desbordado

22
www.mkelectronica.com Microcontroladores PIC: Nivel I
Guía rápida de referencia

PIE1 permite habilitar o no las interrupciones asociadas. Se han resaltado los bits que afectan a los
periféricos estudiados en este curso.

NOMBRE: PIE1 (Registro nº 1 para la habilitación de DIR.: 0x8C BANCO: 1


interrupciones)
U-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0
---- ADIE RCIE TXIE SSPIE CCP1IE TMR2IE TMR1IE

Bit 7 No implementado, se lee a “0”


Bit 6 ADIE: Permiso de interrupción del convertidor ADC
1 = Interrupción permitida
0 = Interrupción no permitida
Bit 5 RCIE: Permiso de interrupción en la recepción del USART
1 = Interrupción permitida
0 = Interrupción no permitida
Bit 4 TXIE: Permiso de interrupción en la transmisión del USART
1 = Interrupción permitida
0 = Interrupción no permitida
Bit 3 SSPIE: Permiso de interrupción para el módulo MSSP
1 = Interrupción permitida
0 = Interrupción no permitida
Bit 2 CCP1IE: Permiso de interrupción para el módulo CCP1
1 = Interrupción permitida
0 = Interrupción no permitida
Bit 1 TMR2IE: Permiso de interrupción para el temporizador Timer 2
1 = Interrupción permitida
0 = Interrupción no permitida
Bit 0 TMR1IE: Permiso de interrupción para el temporizador Timer 1
1 = Interrupción permitida
0 = Interrupción no permitida

6.7 Los registros PIR2 y PIE2

PIR2 refleja el estado actual de los restantes periféricos disponibles en el controlador, y que son
capaces de provocar una interrupción. Se han resaltado aquellos bits que afectan a los periféricos
estudiados en este curso:

NOMBRE: PIR2 (Registro de estado de los periféricos nº 2) DIR.: 0x0D BANCO: 0


R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 U-0 R/W-0
OSFIF C2IF C1IF EEIF BCLIF ULPWUIF ---- CCP2IF

Bit 7 OSCIF: Bit de estado del circuito de detección de fallo en el oscilador del sistema
1 = Fallo en el oscilador externo. INTOSC pasa a ser el nuevo oscilador (se borra
por software)
0 = Oscilador externo en funcionamiento
Bit 6 C2IF: Bit de estado del comparador Nº 2
1 = La salida del comparador 2 ha cambiado (se borra por software)
0 = No hay cambio en la salida del comparador Nº 2
Bit 5 C1IF: Bit de estado del comparador Nº 1
1 = La salida del comparador 1 ha cambiado (se borra por software)
0 = No hay cambio en la salida del comparador 1
Bit 4 EEIF: Bit de estado del ciclo de escritura sobre la EEPROM de datos
1 = El ciclo de escritura ha finalizado (se debe borrar por software)
0 = El ciclo de escritura no ha finalizado o no se ha iniciado

23
www.mkelectronica.com Microcontroladores PIC: Nivel I
Guía rápida de referencia

Bit 3 BCLIF: Bit de colisión de datos


1 = Se ha producido una colisión de datos en el bus I2C en modo Master
0 = No se ha producido colisión de datos
Bit 2 ULPWUIF: Bit de estado de la interrupción de bajo consumo
1 = Detectado flanco descendente de interrupción por RA0/ULPWU (debe
borrarse por software)
0 = No se ha detectado el flanco por RA0/ULPWU
Bit 1 No implementado, se lee como nivel “0”
Bit 0 CCP2IF: Bit de estado del módulo CCP2
Modo Captura
1 = Se ha capturado el valor del Timer 1 (debe borrarse por software)
0 = No se ha capturado el valor del Timer 1
Modo Comparación
1 = El valor del Timer 1 coincide con el valor del registro de comparación (se
debe borrar por software)
0 = El valor del Timer 1 no coincide
Modo PWM
No se usa en este modo

PIE2 permite habilitar o no las interrupciones asociadas. Se han resaltado aquellos bits que afectan
a los periféricos estudiados en este curso:

NOMBRE: PIE2 (Registro nº 2 para la habilitación de DIR.: 0x8D BANCO: 1


interrupciones)
R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 U-0 R/W-0
OSFIE C2IE C1IE EEIE BCLIE ULPWUIE ---- CCP2IE

Bit 7 OSFIE: Permiso de interrupción para el circuito de detección de fallos del


oscilador del sistema
1 = Interrupción permitida
0 = Interrupción no permitida
Bit 6 C2IE: Permiso de interrupción del comparador nº 2
1 = Interrupción permitida
0 = Interrupción no permitida
Bit 5 C1IE: Permiso de interrupción del comparador nº 1
1 = Interrupción permitida
0 = Interrupción no permitida
Bit 4 EEIE: Permiso de interrupción al acabar un ciclo de escritura en la EEPROM
de datos
1 = Interrupción permitida
0 = Interrupción no permitida
Bit 3 BCLIE: Permiso de interrupción al detectar colisión de datos en el bus I2C
en modo Master
1 = Interrupción permitida
0 = Interrupción no permitida
Bit 2 ULPWUIE: Permiso de la interrupción de bajo consumo al detectar flanco
descendente en RA0
1 = Interrupción permitida
0 = Interrupción no permitida
Bit 1 No implementado, se lee como nivel “0”
Bit 0 CCP2IE: Permiso de interrupción del módulo CCP2
1 = Interrupción permitida
0 = Interrupción no permitida

24
www.mkelectronica.com Microcontroladores PIC: Nivel I
Guía rápida de referencia

7.- Los Temporizadores o “Timers”


7.1 EL TIMER 0 (TMR0)

Temporizador de 8 bits con posibilidad de preescaler de 1:2 a 1:256 y capacidad de interrupción.

7.1.1 El registro OPTION para el TMR0

Configura, entre otros, los diferentes modos de trabajo del Timer 0 (TMR0)

Nombre: OPTION_REG (Registro de Dirección: 0x01 Bancos: 1 y 3


opciones)
R/W-1 R/W-1 R/W-1 R/W-1 R/W-1 R/W-1 R/W-1 R/W-1
/RBU INTEDG T0CS T0SE PSA PSA2 PSA1 PSA0

/RBPU Activación de las resistencias Pull-Up de PORTB


1 = Resistencias Pull-Up deshabilitadas
0 = Resistencias Pull-Up habilitadas
INTEDG Selección del flanco activo de la interrupción externa por la patilla RB0/INT
1 = Interrupción sensible al flanco ascendente
0 = Interrupción sensible al flanco descendente
T0CS Selección de reloj para el Timer 0 (TMR0)
1 = Reloj externo por la patilla RA4/T0CKI
0 = Reloj interno del sistema (Fosc/4)
T0SE Selección del flanco activo del reloj externo para el TMR0
1 = El TMR0 evoluciona con cada flanco descendente por la patilla RA4/T0CKI
0 = El TMR0 evoluciona con cada flanco ascendente por la patilla RA4/T0CKI
PSA Asignación del prescaler
1 = El prescaler se asigna al supervisor Watch Dog (WDT), prescaler 1:1 para el TMR0
0 = El prescaler se asigna al Timer 0 (TMR0)
PS<2:0> Selección del valor del prescaler
000 = 1:2 si es para el TMR0; 1:1 si es para WDT
001 = 1:4 si es para el TMR0; 1:2 si es para WDT
010 = 1:8 si es para el TMR0; 1:4 si es para WDT
011 = 1:16 si es para el TMR0; 1:8 si es para WDT
100 = 1:32 si es para el TMR0; 1:16 si es para WDT
101 = 1:64 si es para el TMR0; 1:32 si es para WDT
110 = 1:128 si es para el TMR0; 1:64 si es para WDT
111 = 1:256 si es para el TMR0; 1:128 si es para WDT

25
www.mkelectronica.com Microcontroladores PIC: Nivel I
Guía rápida de referencia

7.1.2 El registro TMR0

Representa al Timer 0 propiamente dicho. Se puede escribir el valor que se desea temporizar, o se
puede leer el estado actual de la cuenta.

NOMBRE: TMR0 (Registro Timer 0) DIR.: BANCO:


0x01 0y2
Bit 7 6 5 4 3 2 1 Bit 0

7.2 EL TIMER 1 (TMR1)

Temporizador de 16 bits con prescaler de 1:1, 1:2, 1:4 y 1:8 y capacidad de interrupción

7.2.1 El registro T1CON

Permite configurar los diferentes modos de trabajo del Timer 1

Nombre: T1CON (Registro de control del Dirección: 0x10 Banco: 0


Timer 1)
R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0
T1GIN TMR1GE T1CKPS1 T1CKPS0 T1OSCEN /T1SYNC TMR1CS TMR1ON

T1GINV Polaridad de disparo para el Timer 1


1 = El Timer 1 funciona cuando el evento se encuentra a “1”
0 = El Timer 1 funciona cuando el evento se encuentra a “0”
TMR1GE Activación de la función de disparo
Si el bit TMR1ON=0
Este bit se ignora
Si el bit TMR1ON=1
1 = La evolución del Timer 1 se controla con los eventos
0 = La evolución del Timer 1 es constante e independiente de los eventos

26
www.mkelectronica.com Microcontroladores PIC: Nivel I
Guía rápida de referencia

T1CKPS<1:0> Selección del prescaler para el Timer 1


11 = Prescaler de 1:8
10 = Prescaler de 1:4
01 = Prescaler de 1:2
00 = Prescaler de 1:1
T1OSCEN Activación del oscilador interno LP de 32,768 KHz
1 = El oscilador LP se emplea como reloj del Timer 1
0 = El oscilador LP en Off
/T1SYNC Sincronismo del reloj externo del Timer 1
TMR1CS=1
1 = El reloj externo del Timer 1 no se sincroniza con el reloj del sistema
0 = El reloj externo del Timer 1 se sincroniza con el reloj del sistema
TMR1CS=0
Este bit se ignora ya que en este caso se emplea el propio reloj interno del
sistema
TMR1CS Selección de la fuente de reloj para el Timer 1
1 = Reloj externo desde la patilla RC0/T1CKI (sensible al flanco ascendente)
0 = Reloj interno del sistema (Fosc/4 o 4Tosc)
TMR1ON Activación del Timer 1
1 = Activa el Timer 1
0 = Desactiva el Timer 1

7.2.2 Los registros TMR1H y TMR1L

Contienen los 8 bits de más peso y los 8 de menos peso con los que se forman los 16 bits del Timer
1. Sobre ellos se puede escribir el valor que se desea temporizar, o bien se puede leer el estado actual de la
temporización.

NOMBRE: TMR1H (Parte alta del DIR.: BANCO:


Timer 1) 0x0E 0
Bit 7 6 5 4 3 2 1 Bit 0

NOMBRE: TMR1L (Parte baja del DIR.: BANCO:


Timer 1) 0x0F 0
Bit 7 6 5 4 3 2 1 Bit 0

7.3 EL TIMER 2 (TMR2)

Es un temporizador de 8 bits dotado de prescaler 1:1, 1:4 y 1:16 y de un postcaler que va desde 1:1
hasta 1:16. También consta de un registro de periodos, el PR2, y capacidad de interrupciones

27
www.mkelectronica.com Microcontroladores PIC: Nivel I
Guía rápida de referencia

7.3.1 El registro T2CON

Permite configurar los diferentes modos de trabajo del Timer 2

Nombre: T2CON (Registro de control del Dirección: 0x12 Banco: 0


Timer 2)
U-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0
---- TOUTPS3 TOUTPS2 TOUTPS1 TOUTPS0 TMR2ON T2CKPS1 T2CKPS0

Bit 7 No implementado, se lee a nivel “0”


TOUTPS<3:0> Selección del postcaler del Timer 2
0000 = Postcaler 1:1 1000 = Postcaler 1:9
0001 = Postcaler 1:2 1001 = Postcaler 1:10
0010 = Postcaler 1:3 1010 = Postcaler 1:11
0011 = Postcaler 1:4 1011 = Postcaler 1:12
0100 = Postcaler 1:5 1100 = Postcaler 1:13
0101 = Postcaler 1:6 1101 = Postcaler 1:14
0110 = Postacler 1:7 1110 = Postcaler 1:15
0111 = Postcaler 1:8 1111 = Postcaler 1:16
TMR2ON Activación del Timer 2
1 = Timer 2 activado
0 = Timer 2 desactivado
T2CKPS<1:0> Selección del prescaler del Timer 2
00 = Prescaler 1
01 = Prescaler 4
1X = Prescaler 16

7.3.2 Los registros TMR2 y PR2

El registro TMR2 representa al Timer 2. Sobre él se escribe el valor a temporizar, o bien se lee el
estado actual de la temporización. El registro PR2 contiene el valor límite hasta el que debe evolucionar el
TMR2, momento en que se pone a 0 y se repite la cuenta.

NOMBRE: TMR2 (Registro del Timer DIR.: BANCO:


1) 0x11 0
Bit 7 6 5 4 3 2 1 Bit 0

NOMBRE: PR2 (Registros de DIR.: BANCO:


periodos del Timer 2) 0x92 1
Bit 7 6 5 4 3 2 1 Bit 0

28
www.mkelectronica.com Microcontroladores PIC: Nivel I
Soluciones a los ejercicios propuestos

UNIDAD 3: EMPEZANDO A TRABAJAR


T-3.2.6 Ahora tú

Si estás familiarizado con el sistema binario, no te será muy difícil completar la siguiente tabla con
los diferentes resultados que se obtienen como consecuencia de realizar diferentes operaciones entre dos
valores de 8 bits, Dato A y Dato B.

Detalles que debes tener en cuenta:

1. Nuestro controlador es de 8 bits. El valor máximo de los datos con los que hacer la operación, así
8
como el resultado obtenido, es de 255 (2 -1).
2. Si trabajas con número con signo, los valores máximos de los datos con los que vas a operar, así
como el resultado, será de 0 a 127 y de -1 a -128 (en complemento a 2).
3. En la resta, los bits DC y C del registro STATUS de estado, operan de forma invertida con respecto
a la suma. Es decir, cuando están a nivel “1”, indican que NO hay llevada.
4. Con la instrucción Restar (SUBLW) se resta al valor indicado en la instrucción, el valor que en ese
momento hay en el registro W. Es decir, el contenido del registro W actúa como sustraendo.

Cargar Dato A INSTRUC- Dato B Resultado en W Z DC C


W BIN DEC CIÓN BIN DEC BIN DEC
MOVLW 00000101 5 ADDLW 00000011 3 00001000 8 0 0 0
MOVLW 00001001 9 ADDLW 00000111 7 00010000 16 0 1 0
MOVLW 01101001 105 ADDLW 01111000 120 11100001 225 0 1 0
MOVLW 10000101 133 ADDLW 10010110 150 00011011 27 0 0 1
MOVLW 11010010 210 ADDLW 00101110 46 00000000 0 1 1 1
MOVLW 00000011 3 SUBLW 00001001 9 00000110 6 0 1 1
MOVLW 01000110 70 SUBLW 01100111 103 00100001 33 0 1 1
MOVLW 01101001 105 SUBLW 01111000 120 00001111 15 0 0 1
MOVLW 00001001 9 SUBLW 00000111 7 11111110 254 0 0 0
MOVLW 00111000 56 SUBLW 00111000 56 00000000 0 1 1 1

P-3.5.2 Ejecución paso a paso

1. Pulsa el botón Reset. En la ventana del programa fuente aparece una flecha verde que apunta a la
instrucción que toca ejecutar, “goto Inicio”. En la ventana Stopwatch los contadores se ponen a 0.
Has simulado un RESET en el controlador.

2. Ahora vas a ejecutar una instrucción y solo una. Pulsa el botón Step Into. Has ejecutado la
instrucción “goto Inicio”.

3. La flecha verde apunta ahora a la siguiente instrucción que toca ejecutar, “Inicio movlw .12”. Se ha
ejecutado el salto de la instrucción anterior.

4. Observa y completa. El registro PCL vale 0x05 , que es la dirección donde se encuentra la
instrucción movlw .12 que toca ejecutar.

5. Según la ventana Stopwatch busca y anota el valor de Instruction Cycles = 2 y el valor de


Time = 2 . Representa el tiempo que tardó en ejecutarse la instrucción goto inicio. ¿Cuánto ? 2
µ S

S3-1
www.mkelectronica.com Microcontroladores PIC: Nivel I
Soluciones a los ejercicios propuestos

6. Pulsa nuevamente el botón Step Into para ejecutar la instrucción “mowlw .12”. La flecha verde en la
ventana del programa fuente apunta a la siguiente instrucción.

7. Anota los valores del PCL = 0x06 , WREG = 12

8. Anota los valores de Instruction Cycles = 3 y Time = 3 . ¿Cuánto tardó en ejecutarse la


instrucción ? 1 µS

9. Pulsa nuevamente el botón Step Into para ejecutar la instrucción “addlw .24”. La flecha verde en la
ventana del programa fuente apunta a la siguiente instrucción.

10. Anota los valores del PCL = 0x07 , WREG = 36 y STATUS = 00011010 . Indica el estado de los
bits Z= 0 , DC= 1 y C= 0

11. Anota los valores de Instruction Cycles = 4 y Time = 4 . ¿Cuánto tardó en ejecutarse la
instrucción ? 1 µS

12. Pulsa nuevamente el botón Step Into para ejecutar la instrucción “movwf Resultado”. La flecha
verde en la ventana del programa fuente apunta a la siguiente instrucción.

13. Anota los valores del PCL = 0x08 , WREG = 36 y Resultado = 36 . Indica el estado de los bits Z=
0 , DC= 1 y C= 0

14. Anota los valores de Instruction Cycles = 5 y Time = 5 . ¿Cuánto tardó en ejecutarse la
instrucción ? 1 µS

15. Pulsa nuevamente el botón Step Into para ejecutar la instrucción “Fin goto Fin”. La flecha verde en
la ventana del programa fuente apunta a la siguiente instrucción. ¿Cuál es esta? Fin goto Fin

16. Anota los valores de Instruction Cycles = 7 y Time = 7 . ¿Cuánto tardó en ejecutarse la
instrucción? 2 µS

17. Pulsa nuevamente el botón Step Into para ejecutar la instrucción “Fin goto Fin”. La flecha verde en
la ventana del programa fuente apunta a la siguiente instrucción. ¿Cuál es esta? Fin goto fin

18. Anota los valores de Instruction Cycles = 9 y Time = 9 . ¿Cuánto tardó en ejecutarse la
instrucción 2 µS ?

19. Puedes repetir los pasos 17 y 18 todas las veces que quieras. ¿Qué valores son los únicos que
cambian? Intsruction Cycles y Time ¿Porqué?

Porque representan el tiempo de ejecución del bucle infinito de la instrucción Fin goto fin

Ahora tú

Te voy a pedir que modifiques el programa fuente pues ahora se trata de sumar .198 + .120 (en hex
0xC6 + 0x78). Aunque se trata del mismo proyecto, debes volverlo a ensamblar y depurar, simulándolo
mediante la técnica del paso a paso que acabas de emplear. Repasa los apartados T-3.4.1 y T-3.5.2.
Completa la siguiente tabla.

INSTRUCCION PCL Z DC C WREG Resultado Ciclos Time


RESET 0x00 x x x x x 0 0
goto Inicio 0x00 x x x x x 0 0

S3-2
www.mkelectronica.com Microcontroladores PIC: Nivel I
Soluciones a los ejercicios propuestos

Inicio movlw .198 0x05 x x x x x 2 2


addlw .120 0x06 0 0 1 198 x 3 3
movwf Resultado 0x07 0 0 1 62 x 4 4
Fin goto Fin 0x08 0 0 1 62 62 5 5
Fin goto Fin 0x08 0 0 1 62 62 7 7

Vuelve a repetir el ejercicio pero sumando .49 + .207 (en hex 0x31 + 0xCF) y completando de nuevo
la tabla.

INSTRUCCION PCL Z DC C WREG Resultado Ciclos Time


RESET 0x00 x x x x x 0 0
goto Inicio 0x00 x x x x x 0 0
Inicio movlw .49 0x05 x x x x x 2 2
addlw .207 0x06 x x x 49 x 3 3
movwf Resultado 0x07 1 1 1 0 x 4 4
Fin goto Fin 0x08 1 1 1 0 0 5 5
Fin goto Fin 0x08 1 1 1 0 0 7 7

Fíjate bien en los bits Z, DC y C del registro STATUS. Su valor depende del resultado de las
diferentes sumas. Repasa esta instrucción (ADDLW) en el apartado T-3.2.3.

P-3.6 TRABAJO PERSONAL

6. Completa la siguiente tabla con los resultados obtenidos:

INSTRUCCION PCL Z DC C WREG Resultado Ciclos Time


RESET 0x00 x x x x x 0 0
goto Inicio 0x00 x x x x x 0 0
Inicio movlw .23 0x05 x x x x x 2 2
sublw .45 0x06 x x x 23 x 3 3
movwf Resultado 0x07 0 1 1 22 x 4 4
Fin goto Fin 0x08 0 1 1 22 22 5 5
Fin goto Fin 0x08 0 1 1 22 22 7 7

7. Cambia los valores. El sustraendo pasa a ser .85 (en hex 0x55) en lugar de .23, el minuendo es
ahora .67 (en hex 0x43) en lugar de .45. Vas a restar .67 - .85 (0x43 – 0x55). Completa nuevamente
la tabla, y razona los resultados.

INSTRUCCION PCL Z DC C WREG Resultado Ciclos Time


RESET 0x00 x x x x x 0 0
goto Inicio 0x00 x x x x x 0 0
Inicio movlw .85 0x05 x x x x x 2 2
sublw .67 0x06 x x x 85 x 3 3
movwf Resultado 0x07 0 0 0 238 x 4 4
Fin goto Fin 0x08 0 0 0 238 238 5 5
Fin goto Fin 0x08 0 0 0 238 238 7 7

8. Vuelve a cambiar los valores. Ahora restarás .112 - .112 (0x70 – 0x70). Completa la tabla y razona
los resultados

INSTRUCCION PCL Z DC C WREG Resultado Ciclos Time


RESET 0x00 x x x x x 0 0
goto Inicio 0x00 x x x x x 0 0
Inicio movlw .112 0x05 x x x x x 2 2
sublw .112 0x06 x x x 112 x 3 3
movwf Resultado 0x07 1 1 1 0 x 4 4
Fin goto Fin 0x08 1 1 1 0 0 5 5

S3-3
www.mkelectronica.com Microcontroladores PIC: Nivel I
Soluciones a los ejercicios propuestos

Fin goto Fin 0x08 1 1 1 0 0 7 7

9. Ahora vas a desarrollar tú mismo un nuevo programa de ejemplo, el “Ejemplo 3-3.asm”. Se trata de
que realice el siguiente cálculo: .210 – (.34 +.26). En hexadecimal sería 0xD2 – (0x22 + 0x1A). Crea
un nuevo proyecto, el “Ejemplo 3-3.mcp”, lo ensamblas y lo simulas. Como con los anteriores
ejemplos, completa la siguiente tabla.

INSTRUCCION PCL Z DC C WREG Resultado Ciclos Time


RESET 0x00 x x x x x 0 0
goto Inicio 0x00 x x x x x 0 0
Inicio movlw .34 0x05 x x x x x 2 2
addlw .26 0x06 x x x 34 x 3 3
sublw .210 0x07 0 0 0 60 x 4 4
movwf Resultado 0x08 0 0 1 150 x 5 5
Fin goto Fin 0x09 0 0 1 150 150 6 6
Fin goto Fin 0x09 0 0 1 150 150 8 8

S3-4
www.mkelectronica.com Microcontroladores PIC: Nivel I
Soluciones a los ejercicios propuestos

UNIDAD 4: LAS INSTRUCCIONES DEL PIC16F8XXX


T-4.1.2 Direccionamiento directo

Ahora tú

Supón que el área de memoria RAM de datos tiene, en algunas de sus posiciones,
los valores que se muestran en la figura. Completa la siguiente tabla calculando el
valor que tendrá el registro W según se van ejecutando las diferentes instrucciones
contenidas en ella.

INSTRUCCIÓN OPERANDO DIRECCIONAMIENTO Valor en W


Cargar 0x10 Directo 0x04
Sumar 0x03 Inmediato 0x07
Sumar 0x33 Directo 0x0A
Restar 0x20 Inmediato 0x16
Sumar 0x20 Directo 0x36
Restar 0x52 Inmediato 0x1C
Sumar 0x52 Directo 0x23

A mí me da como resultado el valor 0x23. ¿A ti? 0x23

T-4.1.3 Direccionamiento indirecto

Ahora tú

Supón que el área de memoria RAM de datos tiene, en algunas de sus


posiciones, los valores que se muestran en la figura. Completa la siguiente tabla
calculando el valor que tendrá el registro W según se van ejecutando las
diferentes instrucciones contenidas en ella, y en función de los distintos valores
del registro FSR. Damos por supuesto que el bit IRP del registro STATUS está a
nivel “0”, por lo que se seleccionan los bancos 0 y 1.

FSR INSTRUCCIÓN DIRECCIONAMIENTO Valor en W


0x25 Cargar 0x02 Inmediato 0x02
0x38 Sumar 0x52 Directo 0x09
0x10 Sumar 0x00 Directo 0x0D
0x12 Restar 0x13 Inmediato 0x06
0xB3 Restar 0x00 Directo 0x0D
0xC8 Sumar 0x00 Directo 0x0E
0XC8 Restar 0x0E Inmediato 0x00
0x10 Sumar 0x00 Directo 0x04
0x52 Restar 0x00 Directo 0x03
0x20 Sumar 0x20 Directo 0x23
0x20 Sumar 0x00 Inmediato 0x23
0x20 Restar 0x27 Inmediato 0x04
0xA0 Restar 0x00 Directo 0x02
0XB3 Sumar 0x33 Directo 0x05
0xB3 Sumar 0x00 Directo 0x18

A mí me da como resultado final el valor 0x18. ¿A ti? 0x18

S4-1
www.mkelectronica.com Microcontroladores PIC: Nivel I
Soluciones a los ejercicios propuestos

T-4.1.4 Direccionamiento relativo al PC

Ahora tú

Completa la siguiente tabla que contiene tres programas de ejemplo. En el nº 1 se supone al


PCLATH con el valor 0x03, en el nº 2 con 0x00 y en el nº 3 con 0x11. Se trata de calcular la dirección a la
que salta el PC cuando se ejecutan las instrucciones de cada ejemplo.

EJEMPLO Valor del Dirección Instrucción a Direccionamiento El PC salta


PCLATH actual del PC ejecutar a…
0x0010 Cargar 0x03 Inmediato
1 0x03 0x0011 Sumar 0x05 Inmediato 0x0308
0x0012 Guardar en 0x02 Directo
0x0124 Cargar 0x21 Inmediato
2 0x00 0x0125 Sumar 0x02 Directo 0x0047
0x0126 Guardar en 0x02 Directo
0x0020 Cargar 0x02 Directo
3 0x11 0x0021 Sumar 0x02 Directo 0x1143
0x0022 Guardar en 0x02 Directo

A mí me sale: 1º = 0x0308, 2º = 0x0047 y 3º = 0x1143, ¿a ti? 1º = 0x0308, 2º = 0x0047 y 3 º= 0x1143

P-4.1.4 Ahora tú

Basándonos en el “Ejemplo 4-1.asm” te voy a proponer una serie de modificaciones con objeto de
que puedas experimentar con diferentes instrucciones y resultados.

Sumas

Dato_A Dato_B Resultado Z DC C


24 86 110 0 0 0
128 128 0 1 0 1
210 75 29 0 0 1
90 110 200 0 1 0
0 0 0 1 0 0
63 120 183 0 1 0

Restas

Dato_A Dato_B Resultado Z DC C


24 86 62 0 0 1
128 128 0 1 1 1
210 75 121 0 1 0
90 110 20 0 1 1
0 0 0 1 1 1
63 120 57 0 0 1

Funciones lógicas básicas

Dato_A Dato_B AND Z OR Z XOR Z


10100011 00001100 00000000 1 10101111 0 10101111 0
10101010 01010101 00000000 1 11111111 0 11111111 0
11111111 00001111 00001111 0 11111111 0 11110000 0
00000000 11110000 00000000 1 11110000 0 11110000 0
11000011 11110011 11000011 0 11110011 0 00110000 0
00000001 01010101 00000001 0 01010101 0 01010100 0

S4-2
www.mkelectronica.com Microcontroladores PIC: Nivel I
Soluciones a los ejercicios propuestos

Funciones lógicas derivadas

Dato_A Dato_B NAND Z NOR Z XNOR Z


10100011 00001100 11111111 0 01010000 0 01010000 0
10101010 01010101 11111111 0 00000000 1 00000000 1
11111111 00001111 11110000 0 00000000 1 00001111 0
00000000 11110000 11111111 0 00001111 0 00001111 0
11000011 11110011 00111100 0 00001100 0 11001111 0
00000001 01010101 11111110 0 10101010 0 10101011 0

P-4.2.4 Ahora tú

En base al ejemplo contesta a las siguientes preguntas:

1. Cuánto tiempo tardan en ejecutarse las instrucciones necesarias para rellenar únicamente las
posiciones 0x30 y 0x31 del buffer? 14 µS

2. ¿Cuánto tiempo tarda en ejecutarse la totalidad del programa? 101 µS

3. Si deseas que el valor de relleno sea 0xAA ¿qué debieras hacer?

Poner ese número en la variable “Valor” y volver a ejecutar el programa.

4. Para rellenar un buffer que empieza en la posición 0x40 y finaliza en la posición 0x70 (ambas
incluidas) ¿Qué modificaciones debieras hacer?

Cargar la variable “Contador” con el valor 49 e iniciar el FSR con 0x40

5. En este caso, ¿Cuál sería el tiempo total de ejecución? 299 µS

P-4.4.4 Ahora tú

Mide y anota el tiempo que tarda en ejecutarse un ciclo del programa. Es decir, el tiempo que
trascurre desde que el bit 0 de la variable “Salida” pasa de valer nivel “0” a valer nivel “1” o viceversa.

Ciclos de instrucción = de “1” a “0”= 6 µS, de “0” a “1” 5 µS Tiempo = 6 / 5 µS

Ahora modifica el programa principal por este otro:

;Programa principal
Inicio clrf Salida ;Puesta a 0 inicial
movlw 0b00000001
Loop xorwf Salida,1 ;Función OR exclusiva
goto Loop ;Repite el chequeo

¿Funciona de la misma manera? SI

¿Te atreves a dar una explicación?

La función xorwf Salida, 1 entre el valor 0b00000001 y lo que haya en el bit 0 de “Salida”, realiza el
inverso de ese bit y lo deja también en el bit 0 de “Salida”

S4-3
www.mkelectronica.com Microcontroladores PIC: Nivel I
Soluciones a los ejercicios propuestos

Vuelve a medir y a anotar el tiempo que tarda en ejecutarse un ciclo del programa

Ciclos de instrucción = de “1” a “0”= 3 µS, de “0” a “1” 3 µS Tiempo = 3 µS

P-4.5.3 Ahora tú

En el ejemplo desplazabas de izda. a dcha., y de dcha. a izda. el nivel “1” de la variable “Salida”:
00000001  10000000  00000001. Imagina que se desea desplazar un nivel “0” sobre esa misma
variable: 11111110  01111111  11111110. Anota a continuación los cambios que debes hacer en el
programa fuente.

Sustituir movlw b’00000001’ por la instrucción movlw b’11111110’


Sustituir bcf STATUS, por bsf STATUS,C
Sustituir las instrucciones btfss STATUS,C por btfsc STATUS,C

S4-4
www.mkelectronica.com Microcontroladores PIC: Nivel I
Soluciones a los ejercicios propuestos

UNIDAD 5: LOS PUERTOS DE E/S


T- 5.6 AHORA TÚ

Supón que, como se muestra en la figura, en las patillas de las diferentes puertas tienes conectados
una serie de periféricos. Fíjate en el sentido de las flechas porque determinan si el periférico asociado a
cada patilla es de entrada o de salida. Completa las tablas de los siguientes apartados con las instrucciones
necesarias para configurar cada puerta en función de las especificaciones.

T-5.6.1 Configurando la Puerta A

La patilla RA0 y RA3 actúan como entradas analógicas (AN0 y AN3). El resto de patillas son
entradas o salidas digitales. Se supone un oscilador interno de trabajo por lo que no está seleccionado el
modo de oscilador XT, HS ni LP.

INSTRUCCIÓN DESCRIPCIÓN
clrf PORTA ;Borra salidas
bsf STATUS,RP0
bsf STATUS,RP1 ;Banco 3
movlw b’00001001’
movwf ANSEL ;RA3 y RA0 patillas analógicas
bcf STATUS,RP1 ;Banco 1
movlw b’11001001’
movwf TRISA ;Configura E/S
bcf STATUS,RP0 ;Banco 0

T-5.6.2 Configurando la Puerta B

Las patillas de la Puerta B actúan todas ellas como entradas o salidas digitales. A las patillas
RB3:RB0 se les asocia las resistencias pull-up internas y tienen capacidad de interrupción cada vez que
cambien de estado.

S5-1
www.mkelectronica.com Microcontroladores PIC: Nivel I
Soluciones a los ejercicios propuestos

INSTRUCCIÓN DESCRIPCIÓN
clrf PORTB ;Borra salidas
bsf STATUS,RP0
bsf STATUS,RP1 ;Banco 3
clrf ANSELH ;Puerta B digital
bcf STATUS,RP1 ;Banco 1
movlw b’00001111’
movwf WPUB ;Pull-Up para RB3:RB0
movwf IOCB ;Habilita interrupción por cambio de estado para RB3:RB0
movwf TRISB ;RB7:RB4 salidas y RB3:RB0 estradas
bcf OPTION_REG,/RBU ;Activa el sistema de resistencias Pull-Up
bcf STATUS,RP0 ;Banco 0

T-5.6.3 Configurando la Puerta C

Las patillas de la Puerta C se configuran como entradas o salidas digitales según la figura anterior.

INSTRUCCIÓN DESCRIPCIÓN
clrf PORTC ;Borra salidas
bsf STATUS,RP0 ;Banco 1
movlw b’11001100’
movwf TRISC ;Configura E/S
bcf STATUS,RP0 ;Banco 0

P-5.3.7 Ahora tú

Este ejemplo es tan sencillo que pocas modificaciones vas a poder realizar. Puedes hacer algún tipo
de cálculo aritmético/lógico con el valor binario que lees desde los interruptores de entrada conectados a las
patillas de la Puerta A. El resultado lo visualizas, también en binario, sobre los leds de salida conectados en
las patillas de la Puerta B.

En el programa principal, entre la instrucción de leer la Puerta A (“Loop movf PORTA,W)”, y la de


escribir sobre la Puerta B (“movwf PORTB”), intercalas la instrucción apropiada según el cálculo que vayas
a realizar. No te olvides de que cada vez que modificas el programa fuente, lo debes ensamblar
nuevamente.

Completa la siguiente tabla con los resultados que obtienes en la Puerta B según el cálculo
realizado, y a partir de los valores binarios de entrada sugeridos en la Puerta A.

S5-2
www.mkelectronica.com Microcontroladores PIC: Nivel I
Soluciones a los ejercicios propuestos

CALCULO VALORES BINARIOS DE ENTRADA EN LA PUERTA A


REALIZADO xx001100 xx101010 xx010101 xx000000 xx001000 xx000011 xx010101
andlw b’00111100’ 00001100 00101000 00010100 00000000 00001000 00000000 00010100
iorlw b’00010001’ xx011101 xx111011 xx010101 xx010001 xx011001 xx010011 xx010101
xorlw b’00110011’ xx111111 xx011001 xx100110 xx110011 xx111011 xx111100 xx100111
addlw b’00000100’ 00010000 00101110 00011001 00000100 00001100 00000111 00011000
sublw b’00110000’ 00100100 00000110 00011011 00110000 00101000 00101101 00011100

P-5.4.6 Ahora tú

Si ejecutas el programa en tiempo real, tal y como está, te parecerá que funciona correctamente. S0
es igual a E0 y S1 es el complemento de E0. Sin embargo, te aseguro que el programa no es del todo
correcto. Hay un fallo que sólo lo puedes apreciar (si no lo has hecho ya) cuando lo ejecutas paso a paso.

Describe a continuación en qué consiste el fallo, y completa la tabla con las modificaciones que
debieras de hacer en el programa original para corregirlo.

Hay breves instantes en los que o bien ambas salidas están activadas, o bien desactivadas. Es decir,
que valen lo mismo y por lo tanto no se cumple con el enunciado del programa.

PROGRAMA ORIGINAL PROGRAMA MODIFICADO


Loop btfsc PORTA, 0 Loop btfsc PORTA, 0
goto RA0_es_1 goto RA0_es_1
bcf PORTB,0 movlw b’00000010’
bsf PORTB,1 movwf PORTB
goto Loop goto Loop
RA0_es_1 bsf PORTB,0 RA0_es_1 movlw b’00000001’
bsf PORTB,1 movwf PORTB,1
goto Loop goto Loop

P-5.7.7 Trabajo personal

Este ejemplo se presta a que experimentes con tus capacidades visuales. Efectivamente, mediante
el empleo de la macro “Delay 250 Milis”, cada led permanece encendido 250 ms (0,25 s), lo que te permite
ver perfectamente la transición en cada uno. Pero ¿qué pasaría si quitamos o disminuimos esta
temporización? Te sugiero que hagas diferentes pruebas y completes la siguiente tabla para tener una
referencia. Conforme disminuyes el valor de la temporización, las rotaciones se van realizando más
rápidamente. Llega un momento en que tienes la sensación óptica de que todos los leds están encendidos.
La retina de nuestros ojos no es capaz de percibir las variaciones a esa velocidad. Más adelante nos
aprovecharemos de este mismo efecto óptico para la visualización sobre displays numéricos.

TEMPORIZACIÓN ¿QUÉ VES?

Delay 125 Milis Anota lo que aprecies

Delay 50 Milis Anota lo que aprecies

Delay 25 Milis Anota lo que aprecies

Delay 10 Milis Anota lo que aprecies

S5-3
www.mkelectronica.com Microcontroladores PIC: Nivel I
Soluciones a los ejercicios propuestos

S5-4
www.mkelectronica.com Microcontroladores PIC: Nivel I
Soluciones a los ejercicios propuestos

UNIDAD 6: OTROS PERIFERICOS DIGITALES


T-6.1.2 Ahora tú

Seguramente te habrás dado cuenta de que un display de siete segmentos puede visualizar otros
símbolos aparte de los clásicos numéricos. A la vista del display de la figura, completa la siguiente tabla
indicando qué segmentos se deben activar para visualizar los símbolos propuestos. Recuerda que el
laboratorio dispone de displays de ánodo común.

Símbolo SEGMENTOS Valor


dp g f e d c b a en HEX.
t 1 0 0 0 0 1 1 1 0x87
º 1 0 0 1 1 1 0 0 0x9C
n 1 0 1 0 1 0 1 1 0xAB
h 1 0 0 0 0 0 1 1 0x83
H 1 0 0 0 1 0 0 1 0x89
ñ 1 0 1 0 1 0 1 0 0xAA
r 1 0 1 0 1 1 1 1 0xAF
q 1 0 0 1 0 0 0 0 0x90
y 1 0 0 1 0 0 0 1 0x91
P 1 0 0 0 1 1 0 0 0x8C
u 1 1 1 0 0 0 1 1 0xE3
U 1 1 0 0 0 0 0 1 0xC1

T-2.6.7 Ahora tú

Completa la siguiente tabla para definir los caracteres gráficos propuestos. Indica el valor binario y
hexadecimal que hay que guardar en cada posición de la memoria CGRAM, las direcciones de esta y el
código del carácter que tendrías que usar cuando vayas a usar visualizar cualquiera de ellos.

CARACTER Bits en la memoria CGRAM Valor Dirección Código del


7 6 5 4 3 2 1 0 en Hex. en CGRAM carácter
0 0 0 0 1 0 1 0 0x0A 0x00
0 0 0 1 0 1 0 1 0x15 0x01
0 0 0 1 0 0 0 1 0x11 0x02
0 0 0 1 0 0 0 1 0x11 0x03
0 0 0 1 0 0 0 1 0x11 0x04 0x00
0 0 0 0 1 0 1 0 0x0A 0x05
0 0 0 0 0 1 0 0 0x04 0x06
0 0 0 0 0 0 0 0 0x00 0x07
0 0 0 0 0 0 0 0 0x00 0x10
0 0 0 0 1 0 1 0 0x0A 0x11
0 0 0 0 0 0 0 0 0x00 0x12
0 0 0 0 0 1 0 0 0x04 0x13
0 0 0 0 0 0 0 0 0x00 0x14 0x02
0 0 0 1 0 0 0 1 0x11 0x15
0 0 0 0 1 1 1 0 0x0E 0x16
0 0 0 0 0 0 0 0 0x00 0x17
0 0 0 1 1 1 1 1 0x1F 0x18
0 0 0 0 0 0 0 0 0x00 0x19
0 0 0 1 0 1 1 0 0x16 0x1A
0 0 0 1 1 0 0 1 0x19 0x1B
0 0 0 1 0 0 0 1 0x11 0x1C 0x03
0 0 0 1 0 0 0 1 0x11 0x1D
0 0 0 1 0 0 0 1 0x11 0x1E
0 0 0 0 0 0 0 0 0x00 0x1F

S6-1
www.mkelectronica.com Microcontroladores PIC: Nivel I
Soluciones a los ejercicios propuestos

0 0 0 0 0 0 1 0 0x02 0x30
0 0 0 0 0 1 0 0 0x04 0x31
0 0 0 1 0 0 0 1 0x11 0x32
0 0 0 1 0 0 0 1 0x11 0x33
0 0 0 1 0 0 0 1 0x11 0x34 0x06
0 0 0 1 0 0 1 1 0x13 0x35
0 0 0 0 1 1 0 1 0x0D 0x36
0 0 0 0 0 0 0 0 0x00 0x37

T-6.3.3 Ahora tú

C0 (RB2) C1 (RB1) C2 (RB0)


En la figura tienes el esquema de un
teclado de 12 teclas con una
configuración matricial de 3 x 4. Se trata
1 2 3 de un teclado numérico como puede ser
el de un teléfono. Suponiendo que sus
F0 (RB3)
columnas C0:C2 y sus filas F0:F3 están
4 5 6 conectadas a las patillas de la puerta B
F1 (RB4) del PIC tal y como se indica, se trata de
completar la siguiente tabla con los
7 8 9
códigos de exploración de cada tecla.
F2 (RB5) Se supone que los niveles activos son
* 0 # los niveles “0”.

F3 (RB6)

TECLA FILAS COLUMNAS Código


Pulsada F3(RB6) F2(RB5) F1(RB4) F0(RB3) C0(RB2) C1(RB1) C2(RB0) HEX.
1 1 1 1 0 0 1 1 0x73
2 1 1 1 0 1 0 1 0x75
3 1 1 1 0 1 1 0 0x76
4 1 1 0 1 0 1 1 0x6B
5 1 1 0 1 1 0 1 0x6D
6 1 1 0 1 1 1 0 0x6E
7 1 0 1 1 0 1 1 0x5B
8 1 0 1 1 1 0 1 0x5D
9 1 0 1 1 1 1 0 0x5E
* 0 1 1 1 0 1 1 0x3B
0 0 1 1 1 1 0 1 0x3D
# 0 1 1 1 1 1 0 0x3E

S6-2
www.mkelectronica.com Microcontroladores PIC: Nivel I
Soluciones a los ejercicios propuestos

UNIDAD 7: CIRCUITOS AUXILIARES


T-7.2.3 Ahora tú

Un sencillo ejercicio. Se trata de que codifiques los bits de ambas palabras de configuración para
que el controlador trabaje en las siguientes condiciones:

 Reset por fallo de alimentación (BOR) cuando el controlador esté ejecutando instrucciones y la
tensión caiga por debajo de los 2 V.
 Protección contra lectura tanto de la memoria FLASH de programa como de la EEPROM de datos.
 Tanto el PWRT como el el supervisor Watchdog deben estar activados.
 Oscilador del tipo XT mediante cristal de cuarzo externo de 4 MHz.
 Protección contra escritura del área de memoria FLASH de programa que va desde 0x0000 a
0x00FF
 El resto de opciones quedan configuradas por defecto.

CONFIG1

---- ---- /DEBUG LVP FCMEN IESO BOREN1 BOREN0


1 1 1 1 1 0

/CPD /CP MCLR /PWRTE WDTE FOSC2 FOSC1 FOSC0


0 0 1 0 1 0 0 1

CONFIG2

---- ---- ---- ---- ---- WRT1 WRT0 BOR4V


1 0 0

---- ---- ---- ---- ---- ---- ---- ----

T-7.3.8 Ahora tú

Con estos ejercicios se trata de que practiques con algunos de los conceptos que se han visto en el
apartado dedicado al módulo oscilador.

Ejercicio 1

Se desea trabajar con un oscilador interno a 500 KHz y aprovechar así las patillas RA6 y RA7 como
líneas de E/S de propósito general, al tiempo que ahorramos componentes externos. Codificar
adecuadamente los bits que intervienen en los siguientes registros. El resto de bits déjalos en sus valores
por defecto.

CONFIG1

---- ---- /DEBUG LVP FCMEN IESO BOREN1 BOREN0


1 1 1 1 1 1

/CPD /CP MCLR /PWRTE WDTE FOSC2 FOSC1 FOSC0


1 1 1 1 1 1 0 0

S7-1
www.mkelectronica.com Microcontroladores PIC: Nivel I
Soluciones a los ejercicios propuestos

CONFIG2

---- ---- ---- ---- ---- WRT1 WRT0 BOR4V


1 1 1

---- ---- ---- ---- ---- ---- ---- ----

OSCCON

NOMBRE: OSCCON (Control y estado del módulo DIR.: 0x8F BANCO: 1


oscilador)
---- IRCF2 IRFC1 IRFC0 OSTS HTS LTS SCS
0 1 1 x x x 1

Ejercicio 2

La aplicación necesita un arranque instantáneo a dos velocidades. Al conector la alimentación el


sistema arranca con el oscilador interno. Transcurridos los 1023 ciclos del temporizador OST se emplea un
oscilador externo del tipo XT

Codificar adecuadamente los bits que intervienen en los siguientes registros. El resto de bits déjalos
en sus valores por defecto.

CONFIG1

---- ---- /DEBUG LVP FCMEN IESO BOREN1 BOREN0


1 1 1 1 1 1

/CPD /CP MCLR /PWRTE WDTE FOSC2 FOSC1 FOSC0


1 1 1 1 1 0 0 1

CONFIG2

---- ---- ---- ---- ---- WRT1 WRT0 BOR4V


1 1 1

---- ---- ---- ---- ---- ---- ---- ----

OSCCON

NOMBRE: OSCCON (Control y estado del módulo DIR.: 0x8F BANCO: 1


oscilador)
---- IRCF2 IRFC1 IRFC0 OSTS HTS LTS SCS
1 1 0 x x x 0

Ejercicio 3

La aplicación trabaja con un generador externo conectado por la patilla RA7/OSC1/CLKIN como
fuente general de reloj. Sin embargo, en previsión de posibles fallos, el sistema deberá poder conmutar al
reloj interno con una frecuencia de 8 MHz si hubiera algún error en ese generador externo.

Codificar adecuadamente los bits que intervienen en los siguientes registros. El resto de bits déjalos
en sus valores por defecto.

S7-2
www.mkelectronica.com Microcontroladores PIC: Nivel I
Soluciones a los ejercicios propuestos

CONFIG1

---- ---- /DEBUG LVP FCMEN IESO BOREN1 BOREN0


1 1 1 1 1 1

/CPD /CP MCLR /PWRTE WDTE FOSC2 FOSC1 FOSC0


1 1 1 1 1 0 1 1

CONFIG2

---- ---- ---- ---- ---- WRT1 WRT0 BOR4V


1 1 1

---- ---- ---- ---- ---- ---- ---- ----

OSCCON

NOMBRE: OSCCON (Control y estado del módulo DIR.: 0x8F BANCO: 1


oscilador)
---- IRCF2 IRFC1 IRFC0 OSTS HTS LTS SCS
1 1 1 x x x 0

T-7.4.1 Ahora tú

Se trata de activar el watchdog (WDT) y ajustarlo para que desborde y provoque el RESET cada 8
segundos (aprox.) si no es refrescado previamente mediante la instrucción CLRWDT.

Codificar adecuadamente los bits que intervienen en los siguientes registros. El resto de bits déjalos
en sus valores por defecto. Posiblemente encuentres que hay varias posibilidades. Prueba con varias.

CONFIG1

---- ---- /DEBUG LVP FCMEN IESO BOREN1 BOREN0


1 1 1 1 1 1

/CPD /CP MCLR /PWRTE WDTE FOSC2 FOSC1 FOSC0


1 1 1 1 1 1 1 1

CONFIG2

---- ---- ---- ---- ---- WRT1 WRT0 BOR4V


1 1 1

---- ---- ---- ---- ---- ---- ---- ----

WDTCON

NOMBRE: WDTCON (Registro de control del supervisor WDT) DIR.: 0x105 BANCO: 2
---- ---- ---- WDTPS3 WDTPS2 WDTPS1 WDTPS0 SWDTEN
0 1 1 0 0

S7-3
www.mkelectronica.com Microcontroladores PIC: Nivel I
Soluciones a los ejercicios propuestos

OPTION_REG

Nombre: OPTION_REG Dirección: 0x01 Bancos: 1 y 3


/RBU INTEDG T0CS T0SE PSA PSA2 PSA1 PSA0
1 1 1 1 1 1 1 1

S7-4
www.mkelectronica.com Microcontroladores PIC: Nivel I
Soluciones a los ejercicios propuestos

UNIDAD 8: MEMORIAS EEPROM/FLASH Y LAS INTERRUPCIONES


T-8.2.7 Ahora tú

Mediante una serie de ejercicios se trata de que configures los distintos registros implicados para
activar interrupciones producidas por diferentes sucesos o eventos. Modifica únicamente los bits que se
vean implicados en cada registro, el resto los dejas con sus valores por defecto tras el RESET.

Ejercicio 1

Habilita la interrupción que provoca el Timer 0 cada vez que se desborda.

NOMBRE: INTCON (Registro de control de interrupciones) DIR.: 0x0B BANCO:


Todos
GIE PEIE T0IE INTE RBIE TOIF INTF RBIF
1 0 1 0 0 0 0 x

Ejercicio 2

Las patillas RB0, RB2 y RB5 actuan como entradas digitales, el resto como salidas digitales. Activar
la interrupción cuando se produzca un cambio de estado en cualquiera de ellas.

a) Configurar entradas/salidas digitales

Nombre: ANSELH (Selec. Dirección: 0x189 Banco: 3


analógica)
---- ---- ANS13 ANS12 ANS11 ANS10 ANS9 ANS8
0 0 0 0 0 0

b) Configurar entradas y salidas

Nombre: TRISB (Configuración de B) Dirección: 0x86 Banco: 1


TRISB7 TRISB6 TRISB5 TRISB4 TRISB3 TRISB2 TRISB1 TRISB0
0 0 1 0 0 1 0 1

c) Habilitar individualmente a cada patilla para la interrupción por cambio de estado

Nombre: IOCB (Int. Por cambio) Dirección: 0x96 Banco: 1


IOCB7 IOCB6 IOCB5 IOCB4 IOCB3 IOCB2 IOCB1 IOCB0
0 0 1 0 0 1 0 1

d) Habilitación general de interrupciones

NOMBRE: INTCON (Registro de control de interrupciones) DIR.: 0x0B BANCO:


Todos
GIE PEIE T0IE INTE RBIE TOIF INTF RBIF
1 0 0 0 1 0 0 x

Ejercicio 3

Activar la interrupción externa cada vez que se detecte un flanco descendente por la patilla
RB0/INT, y la interrupción que produce el Timer 1 cuando se desborda.

a) Selección del flanco activo para la interrupción externa

S8-1
www.mkelectronica.com Microcontroladores PIC: Nivel I
Soluciones a los ejercicios propuestos

Nombre: OPTION_REG Dirección: 0x01 Bancos: 1 y 3


/RBU INTEDG T0CS T0SE PSA PSA2 PSA1 PSA0
1 0 1 1 1 1 1 1

b) Habilitación de la interrupción del Timer 1

NOMBRE: PIE1 (Registro nº 1 para la habilitación de DIR.: 0x8C BANCO: 1


interrupciones)
---- ADIE RCIE TXIE SSPIE CCP1IE TMR2IE TMR1IE
0 0 0 0 0 0 0 1

c) Habilitación de la interrupción externa por RB0/INT y permisos generales

NOMBRE: INTCON (Registro de control de interrupciones) DIR.: 0x0B BANCO:


Todos
GIE PEIE T0IE INTE RBIE TOIF INTF RBIF
1 1 0 0 0 0 0 x

Ejercicio 4

Activar la interrupción para el caso de que se detecte un fallo en el oscilador externo (FCSM)

a) Habilitación de la interrupción del circuito de monitorización del reloj (FCSM)

NOMBRE: PIE2 (Registro nº 2 para la habilitación de DIR.: 0x8D BANCO: 1


interrupciones)
OSFIE C2IE C1IE EEIE BCLIE ULPWUIE ---- CCP2IE
1 0 0 0 0 0 0 0

b) Permisos generales

NOMBRE: INTCON (Registro de control de interrupciones) DIR.: 0x0B BANCO:


Todos
GIE PEIE T0IE INTE RBIE TOIF INTF RBIF
1 1 0 0 0 0 0 x

S8-2
www.mkelectronica.com Microcontroladores PIC: Nivel I
Soluciones a los ejercicios propuestos

UNIDAD 9: LOS TEMPORIZADORES O “TIMERS”


T-9.2.7 Ahora tú

En los siguientes ejercicios se te pide configurar al Timer 0 para que trabaje en diferentes
condiciones. Modifica únicamente los bits que sean necesarios en cada registro, el resto los dejas con sus
valores por defecto. Indica también el valor a cargar en el registro propio del temporizador, el registro
especial del TMR0, que se encuentra en la posición 0x01 de los bancos 0 y 2 del área de datos.

Ejercicio 1

El oscilador general del sistema trabaja a 4 MHz por lo que el ciclo de instrucción es de 1 µS
(4Tosc). Se desea que el Timer 0 provoque una interrupción al de 10 mS.

a) Seleccionar el tipo de reloj y el preescaler

Nombre: OPTION_REG (Registro de Dirección: 0x01 Bancos: 1 y 3


opciones)
/RBU INTEDG T0CS T0SE PSA PSA2 PSA1 PSA0
1 1 0 1 0 1 0 1

b) Calcular el valor que hay que cargar en el registro del Timer 0 (debe ser un número entero)

ó −
= = =
× ×

c) Cargar el TMR0

NOMBRE: TMR0 (Registro del Timer 0) DIR.: 0x01 BANCO: 0 y 2


Bit 7 6 5 4 3 2 1 Bit 0
~ . 156

d) Habilitar la interrupción

NOMBRE: INTCON (Registro de control de interrupciones) DIR.: 0x0B BANCO:


Todos
GIE PEIE T0IE INTE RBIE TOIF INTF RBIF
1 0 1 0 0 0 0 x

Ejercicio 2

Una cinta transporta una serie de piezas. Un sensor proporciona un pulso activo por flanco
descendente cada vez que una pieza pasa frente a él. Se desea producir una interrupción cuando hayan
pasado 35 piezas.

a) Seleccionar el tipo de reloj y el preescaler

Nombre: OPTION_REG (Registro de Dirección: 0x01 Bancos: 1 y 3


opciones)
/RBU INTEDG T0CS T0SE PSA PSA2 PSA1 PSA0
1 1 1 1 1 1 1 1

b) Calcular el valor que hay que cargar en el registro del Timer 0 (debe ser un número entero)

S9-1
www.mkelectronica.com Microcontroladores PIC: Nivel I
Soluciones a los ejercicios propuestos

= = =

c) Cargar el TMR0

NOMBRE: TMR0 (Registro Timer 0) DIR.: BANCO:


0x01 0y2
Bit 7 6 5 4 3 2 1 Bit 0
~ . 35

d) Habilitar la interrupción

NOMBRE: INTCON (Registro de control de interrupciones) DIR.: 0x0B BANCO:


Todos
GIE PEIE T0IE INTE RBIE TOIF INTF RBIF
1 0 1 0 0 0 0 x

T-9.3.7 Ahora tú

En los siguientes ejercicios debes configurar al Timer 1 para que trabaje en diferentes condiciones.
Modifica únicamente los bits que sean necesarios en cada registro, el resto los dejas con sus valores por
defecto. Indica también el valor a cargar en los registros propios del temporizador, los registros TMR1L y
TMR1H, que se encuentran en las posiciones 0x0E y 0x0F del banco 0 del área de datos respectivamente.

Ejercicio 1

Calcular la máxima temporización que se puede conseguir con el TMR1 trabajando a una frecuencia
general del sistema (Fosc) de 1 MHz. Configurar los registros apropiados para producir interrupción cuando
transcurra esa temporización.

a) Calcular la máxima temporización posible y el valor a cargar en el Timer 1

ó = ×( × )= × × = = "

ó
= = =
× ×

b) Configurar el Timer 1

Nombre: T1CON (Registro de control del Dirección: 0x10 Banco: 0


Timer 1)
T1GIN TMR1GE T1CKPS1 T1CKPS0 T1OSCEN /T1SYNC TMR1CS TMR1ON
0 0 1 1 0 0 0 1

c) Cargar el Timer 1

NOMBRE: TMR1H (Parte alta del DIR.: BANCO:


Timer 1) 0x0E 0
Bit 7 6 5 4 3 2 1 Bit 0
HIGH ~ . 65535

NOMBRE: TMR1L (Parte baja del DIR.: BANCO:


Timer 1) 0x0F 0
Bit 7 6 5 4 3 2 1 Bit 0
LOW ~ . 65535

S9-2
www.mkelectronica.com Microcontroladores PIC: Nivel I
Soluciones a los ejercicios propuestos

d) Habilitar interrupciones

NOMBRE: PIE1 (Registro nº 1 para la habilitación de DIR.: 0x8C BANCO: 1


interrupciones)
---- ADIE RCIE TXIE SSPIE CCP1IE TMR2IE TMR1IE
0 0 0 0 0 0 1

NOMBRE: INTCON (Registro de control de interrupciones) DIR.: 0x0B BANCO:


Todos
GIE PEIE T0IE INTE RBIE TOIF INTF RBIF
1 1 0 0 0 0 0 x

Ejercicio 2

Provocar una interrupción por segundo. El Timer 1 se alimenta de un cristal de cuarzo externo a
32,768 KHz.

a) Configurar el Timer 1

Nombre: T1CON (Registro de control del Dirección: 0x10 Banco: 0


Timer 1)
T1GIN TMR1GE T1CKPS1 T1CKPS0 T1OSCEN /T1SYNC TMR1CS TMR1ON
0 0 0 0 1 1 1 1

b) Cargar el Timer 1

NOMBRE: TMR1H (Parte alta del DIR.: BANCO:


Timer 1) 0x0E 0
Bit 7 6 5 4 3 2 1 Bit 0
HIGH ~. 32768

NOMBRE: TMR1L (Parte baja del DIR.: BANCO:


Timer 1) 0x0F 0
Bit 7 6 5 4 3 2 1 Bit 0
LOW ~. 32768

c) Habilitar interrupciones

NOMBRE: PIE1 (Registro nº 1 para la habilitación de DIR.: 0x8C BANCO: 1


interrupciones)
---- ADIE RCIE TXIE SSPIE CCP1IE TMR2IE TMR1IE
0 0 0 0 0 0 1

NOMBRE: INTCON (Registro de control de interrupciones) DIR.: 0x0B BANCO:


Todos
GIE PEIE T0IE INTE RBIE TOIF INTF RBIF
1 1 0 0 0 0 0 x

T-9.4.4 Ahora tú

Con los siguientes ejercicios vas a configurar al Timer 2 para que trabaje en diferentes condiciones.
Modifica únicamente los bits que sean necesarios en cada registro, el resto los dejas con sus valores por
defecto. Partiendo de que el registro TMR2 se inicia siempre con 0, indica también el valor a cargar en el
registro de periodos PR2. Ambos se encuentran en las posiciones 0x11 y 0x92 de los bancos 0 y 1
respectivamente del área RAM de datos.

S9-3
www.mkelectronica.com Microcontroladores PIC: Nivel I
Soluciones a los ejercicios propuestos

Ejercicio 1

Suponiendo que Fosc es de 4 MHz y seleccionas un prescaler de 1:1, configura el Timer 2 para que
produzca una interrupción cada 1 mS.

a) Configurar el Timer 2

Nombre: T2CON (Registro de control del Dirección: 0x12 Banco: 0


Timer 2)
---- TOUTPS3 TOUTPS2 TOUTPS1 TOUTPS0 TMR2ON T2CKPS1 T2CKPS0
0 0 1 1 1 0 0

b) Calcular el valor a cargar en los registros TMR2 y PR2

ó
= = =
× × × ×

c) Cargar el valor en los registros TMR2 y PR2

NOMBRE: TMR2 (Registro del Timer DIR.: BANCO:


1) 0x11 0
Bit 7 6 5 4 3 2 1 Bit 0
0

NOMBRE: PR2 (Registros de DIR.: BANCO:


periodos del Timer 2) 0x92 1
Bit 7 6 5 4 3 2 1 Bit 0
.250

d) Habilitar interrupciones

NOMBRE: PIE1 (Registro nº 1 para la habilitación de DIR.: 0x8C BANCO: 1


interrupciones)
---- ADIE RCIE TXIE SSPIE CCP1IE TMR2IE TMR1IE
0 0 0 0 0 1 0

NOMBRE: INTCON (Registro de control de interrupciones) DIR.: 0x0B BANCO:


Todos
GIE PEIE T0IE INTE RBIE TOIF INTF RBIF
1 1 0 0 0 0 0 x

Ejercicio 2

Suponiendo que Fosc es de 2 MHz, configura el Timer 2 para que produzca una interrupción cada
0.1 seg. aproximadamente. Determina los valores necesarios tanto para el prescaler como para el postcaler,
así como para el registro PR2.

a) Configurar el Timer 2

Nombre: T2CON (Registro de control del Dirección: 0x12 Banco: 0


Timer 2)
---- TOUTPS3 TOUTPS2 TOUTPS1 TOUTPS0 TMR2ON T2CKPS1 T2CKPS0
1 1 1 1 1 1 0

S9-4
www.mkelectronica.com Microcontroladores PIC: Nivel I
Soluciones a los ejercicios propuestos

b) Calcular el valor a cargar en los registros TMR2 y PR2

ó
= = =
× × × ×

c) Cargar el valor en los registros TMR2 y PR2

NOMBRE: TMR2 (Registro del Timer DIR.: BANCO:


1) 0x11 0
Bit 7 6 5 4 3 2 1 Bit 0
0

NOMBRE: PR2 (Registros de DIR.: BANCO:


periodos del Timer 2) 0x92 1
Bit 7 6 5 4 3 2 1 Bit 0
.195

d) Habilitar interrupciones

NOMBRE: PIE1 (Registro nº 1 para la habilitación de DIR.: 0x8C BANCO: 1


interrupciones)
---- ADIE RCIE TXIE SSPIE CCP1IE TMR2IE TMR1IE
0 0 0 0 0 1 0

NOMBRE: INTCON (Registro de control de interrupciones) DIR.: 0x0B BANCO:


Todos
GIE PEIE T0IE INTE RBIE TOIF INTF RBIF
1 1 0 0 0 0 0 x

S9-5
www.mkelectronica.com Microcontroladores PIC: Nivel I
Soluciones a los ejercicios propuestos

S9-6
www.mkelectronica.com Microcontroladores PIC: Nivel I

You might also like