Documente Academic
Documente Profesional
Documente Cultură
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
Á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
1-1
www.mkelectronica.com Microcontroladores PIC: Nivel I
P-1.4.2 USB-PIC’School
P-1.4.3 PIC’Control
MATERIAL COMPLEMENTARIO
1-2
www.mkelectronica.com Microcontroladores PIC: Nivel I
AREA DE TEORÍA
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.
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.).
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.
1-5
www.mkelectronica.com Microcontroladores PIC: Nivel I
T-1.2.1 Memoria RAM
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.
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.
1-6
www.mkelectronica.com Microcontroladores PIC: Nivel I
T-1.2.3 Memoria PROM
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.
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.
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.
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-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.
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!
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).
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.
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.
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:
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.
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.
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 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.
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.
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.
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.).
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.
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).
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).
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.
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
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.
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.
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.
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.
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.
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
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:
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
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
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.
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…
P-1.3.3 USB-PIC’Burner
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.
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.
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
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
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.
1-26
www.mkelectronica.com Microcontroladores PIC: Nivel I
UNIDAD 2: EL UNIVERSO PIC
OBJETIVOS
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.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
2-1
www.mkelectronica.com Microcontroladores PIC: Nivel I
ÁREA DE PRÁCTICAS
MATERIAL COMPLEMENTARIO
2-2
www.mkelectronica.com Microcontroladores PIC: Nivel I
AREA DE TEORÍA
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.
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.
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?
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
2-4
www.mkelectronica.com Microcontroladores PIC: Nivel I
Vamos a hacer un pequeño resumen de las mismas.
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.
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.
Varios son los motivos que me llevan a elegir uno de estos dispositivos de la gama media:
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:
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.
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:
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.
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.
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.
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.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.
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
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).
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.
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.
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.
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
Oscilador interno
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
Decodificador de instrucciones
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
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”.
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.
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.
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.
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-
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.).
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.
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.
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
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:
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.
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.
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
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
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:
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
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.
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
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:
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.
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.
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
Select Device
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
Settings
P-2.1.3 File
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
P-2.1.5 View
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
2-30
www.mkelectronica.com Microcontroladores PIC: Nivel I
T-2.1.7 Debugger
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.
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
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
T-2.1.10 Window
T-2.1.11 Help
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
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.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
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
MATERIAL COMPLEMENTARIO
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”.
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.
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.
Guarda directamente el valor que hay en el registro W sobre la posición de memoria RAM del área
de datos que se indique.
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).
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).
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.
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ú
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.
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.
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.
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.
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.
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.
3-9
www.mkelectronica.com Microcontroladores PIC: Nivel I
P-3.3.1 Iniciando el gestor de proyectos
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).
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”.
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.
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
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.
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…
3-13
www.mkelectronica.com Microcontroladores PIC: Nivel I
P-3.4.1 Iniciando el ensamblado
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.
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.
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.
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…
El contenido de esta ventana ya lo conoces. Contiene el programa fuente tal y como lo escribiste en
la fase de edición.
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”.
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.
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.
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.
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.
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.
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=________
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? _______________
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? _______________
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.
Vuelve a repetir el ejercicio pero sumando .49 + .207 (en hex 0x31 + 0xCF) y completando de nuevo
la tabla.
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 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.
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 .
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.
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:
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.
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:
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.
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.
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”.
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…
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.
8. Vuelve a cambiar los valores. Ahora restarás .112 - .112 (0x70 – 0x70). Completa la tabla y razona
los resultados
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.
3-26
www.mkelectronica.com Microcontroladores PIC: Nivel I
UNIDAD 4: LAS INSTRUCCIONES DEL PIC16F8XXX
OBJETIVOS
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
ÁREA DE PRÁCTICAS
4-1
www.mkelectronica.com Microcontroladores PIC: Nivel I
P-4.3.3 Ejecución / depuración
P-4.3.4 Ahora tú
MATERIAL COMPLEMENTARIO
4-2
www.mkelectronica.com Microcontroladores PIC: Nivel I
AREA DE TEORÍA
Los modos de direccionamiento definen los diferentes comportamientos que puede tener una
instrucción durante su ejecución.
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.
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
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
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.
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.
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.
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:
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:
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.
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.
Ahora tú
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.
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.
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?
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ú
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
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.
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).
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.
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:
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.
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.
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).
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.
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.
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).
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
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
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.
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.
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.
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.
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.
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.
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.
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.
Decrementa en una unidad el valor que haya en la posición de memoria del área de datos indicada.
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.
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
Incrementa en una unidad el valor que haya en la posición de memoria del área de datos indicada.
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.
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.
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
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.
Almacena o guarda el valor actual del registro W sobre la posición de memoria del área de datos
indicada.
Rotación a la izquierda de los bits contenidos en la posición de memoria del área de datos indicada.
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
Rotación a la derecha de los bits contenidos en la posición de memoria del área de datos indicada.
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
Resta, al valor actual que haya en la posición del área de datos indicada, el valor actual del registro
W.
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.
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.
Ú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.
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)
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.
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.
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
Instrucciones de propósito general. Algunas de ellas controlan ciertas tareas específicas propias del
controlador. Son las últimas siete instrucciones a estudiar.
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.
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
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.
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.
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.
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.
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.
Desde el material complementario de esta unidad te puedes descargar los programas fuentes
correspondientes a los ejemplos de esta Unidad 4. Hazlo.
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.
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.
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.
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:
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.
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.
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
Restas
Modifica el programa cambiando la instrucción de sumar (addwf) por la de restar (subwf) también
con direccionamiento directo. Recuerda que:
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”.
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:
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.
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
Con los conocimientos que tienes actualmente debieras ser capaz de resolverlo. Mira el siguiente
programa de ejemplo:
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?
4-29
www.mkelectronica.com Microcontroladores PIC: Nivel I
P-4.2.1 Descripción / edición del programa fuente
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
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.
Ahora vamos con el resto del programa fuente contenido en el fichero “Ejemplo 4-2.asm”
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.
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.
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:
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ú
1. Cuánto tiempo tardan en ejecutarse las instrucciones necesarias para rellenar únicamente las
posiciones 0x30 y 0x31 del buffer? _________________________
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
_______________________________________________________________________________
_______________________________________________________________________________
_______________________________________________________________________________
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
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.
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.
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”.
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?
4-35
www.mkelectronica.com Microcontroladores PIC: Nivel I
P-4.4 Ejemplo 4-4: Manipulación de bits
;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
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”.
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.
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.
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.
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
____________________________________________________________________________________
____________________________________________________________________________________
Vuelve a medir y a anotar el tiempo que tarda en ejecutarse un ciclo del programa
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.
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.
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.
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 !!
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.
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
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ú
MATERIAL COMPLEMENTARIO
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.
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
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.
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:
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
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”).
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....
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.
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.
Mediante el registro ANSELH se puede seleccionar qué líneas de la Puerta B serán entradas
analógicas o entradas/salidas digitales.
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.
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).
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.
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....
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.
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.
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.
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....
NOTAS:
(1) TRISE<3> sólo se puede leer (un “1”) ya que la patilla RE3 únicamente actúa como entrada
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.
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.
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
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.
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.
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.
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 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.
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.
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.
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.
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.
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.
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.
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
¡¡ 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 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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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:
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.
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...).
E2 S2
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.
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. 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.
____________________________________________________________________________________
____________________________________________________________________________________
____________________________________________________________________________________
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
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:
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.
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.
5-29
www.mkelectronica.com Microcontroladores PIC: Nivel I
P-5.5.3 Montaje eléctrico
E0 RA0 S0 RB0
E1 RA1 S1 RB1
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.
Para grabar, primero deshabilita el depurador mediante Debugger Select Tool None y luego
habilita 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.
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
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.
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.
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:
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.
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.
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.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.
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. 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.
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).
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.
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.
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.
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
E0 RA0 S0 RB0
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.
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 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.
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.
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.
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.
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.
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.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
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ú
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
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.
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.
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
+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.
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.
6-6
www.mkelectronica.com Microcontroladores PIC: Nivel I
T-6.2 LA PANTALLA LCD
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
14
13
12
11
10
9
8
7
6
5
4
3
2
1
4
3
2
1
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).
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.
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.
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
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
Código:
RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
0 0 0 0 0 0 0 1 I/D S
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
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
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
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
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
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:
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.
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.
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.
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.
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.
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
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.
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 …”
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.
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.
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.
T-6.3.3 Ahora tú
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
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:
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).
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
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.
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
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.
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.
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).
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.
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.
Procura estudiar bien este ejemplo ya que esta técnica será muy utilizada en múltiples aplicaciones
y proyectos posteriores.
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
E6
conectan con los segmentos del E7
display. +5 Vcc
E. DIGITALES
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.
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.
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.
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.
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.
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.
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
.
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.
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
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
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).
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.
E6
emplea para seleccionar si la cuenta
RA2 E7 será ascendente o descendente.
RA3
E. DIGITALES
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.
_____________________________________________________________________________________
_____________________________________________________________________________________
Posteriormente también puedes modificar el tiempo de esas macros para elevar la temporización a
unos 1000 mS (“Delay 1000 Milis”).
____________________________________________________________________________________
____________________________________________________________________________________
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.
La librería contiene cuatro subrutinas o funciones que ya se han comentado pero que recordamos
nuevamente:
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.
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’).
D0
D1
D2
D3
D4
D5
D6
D7
E
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.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.
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:
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.
Para visualizar cualquier cadena de las definidas, basta con que en el programa principal se
ejecuten estas instrucciones:
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).
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.
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…
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.
Lo más novedoso es la forma de definir las cadenas con los caracteres a visualizar. Se emplea la
siguiente estructura:
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.
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.
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:
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
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
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.
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
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?
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.
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.
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.
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.
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:
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.
Á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.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
MATERIAL COMPLEMENTARIO
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
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.
Cuando el PIC está borrado todos sus bits se ponen a “1”. Es el valor por defecto.
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.
Cuando el PIC está borrado todos sus bits se ponen a “1”. Es el valor por defecto.
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
7-5
www.mkelectronica.com Microcontroladores PIC: Nivel I
CONFIG2
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.
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.
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.
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.
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.
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.
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.
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.
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:
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.
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.
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.
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).
El bit LTS del registro OSCCON indica si la frecuencia de salida del LFINTOSC es estable o no.
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.
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:
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 figura muestra un diagrama de tiempos que resume el proceso de arranque a dos velocidades.
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.
Generar un RESET
Ejecutar la instrucción SLEEP
Cambiar de estado el bit SCS del registro OSCCON
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:
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
CONFIG2
OSCCON
Ejercicio 2
Codificar adecuadamente los bits que intervienen en los siguientes registros. El resto de bits déjalos
en sus valores por defecto.
CONFIG1
7-14
www.mkelectronica.com Microcontroladores PIC: Nivel I
CONFIG2
OSCCON
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
CONFIG2
OSCCON
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.
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
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).
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
7-17
www.mkelectronica.com Microcontroladores PIC: Nivel I
/CPD /CP MCLR /PWRTE WDTE FOSC2 FOSC1 FOSC0
CONFIG2
WDTCON
NOMBRE: WDTCON (Registro de control del supervisor WDT) DIR.: 0x105 BANCO: 2
---- ---- ---- WDTPS3 WDTPS2 WDTPS1 WDTPS0 SWDTEN
OPTION_REG
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:
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:
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)
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.
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).
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).
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 ------ ------
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:
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
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.
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.
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
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.
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.
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).
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
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.
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):
Si este lo retiras no podrán ejecutarse las instrucciones que permiten precisamente seleccionar y
conmutar al oscilador interno.
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:
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.
E0 RA0 S0 RB0
E7 S7
E. DIGITALES
SALIDAS DIGITALES
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.
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.
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
ÁREA DE PRÁCTICAS
8-1
www.mkelectronica.com Microcontroladores PIC: Nivel I
P-8.1.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
MATERIAL COMPLEMENTARIO
8-2
www.mkelectronica.com Microcontroladores PIC: Nivel I
AREA DE TEORÍA
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.
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
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.
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:
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.
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”.
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.
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
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.
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
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
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.
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
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
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.
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:
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.
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:
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.
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.
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.
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.
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:
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:
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:
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
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.
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:
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
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.
8-16
www.mkelectronica.com Microcontroladores PIC: Nivel I
TRISB7 TRISB6 TRISB5 TRISB4 TRISB3 TRISB2 TRISB1 TRISB0
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.
Ejercicio 4
Activar la interrupción para el caso de que se detecte un fallo en el oscilador externo (FCSM)
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
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.
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
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:
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ó.
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.
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.
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
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).
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ú
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.
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
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.
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.
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.
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.).
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.
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.
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.
El resto del programa es bastante secuencial y responde a las necesidades del proyecto.
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
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.
ÁREA DE TEORÍA
T-9.1 INTRODUCCIÓN
T-9.1.1 Temporizaciones por software
T-9.1.2 Temporizaciones por hardware
ÁREA DE PRÁCTICAS
9-1
www.mkelectronica.com Microcontroladores PIC: Nivel I
P-9.1.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ú
9-2
www.mkelectronica.com Microcontroladores PIC: Nivel I
MATERIAL COMPLEMENTARIO
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
1. Emplear rutinas por software cuya ejecución consuma el tiempo deseado. Es lo que has hecho
hasta ahora.
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.
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.
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:
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:
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.
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.
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.
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.
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).
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.
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:
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.
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
d) Habilitar la interrupción
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.
b) Calcular el valor que hay que cargar en el registro del Timer 0 (debe ser un número entero)
= = ___________________
c) Cargar el TMR0
d) Habilitar la interrupción
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.
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:
ó
=
×
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.
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”.
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.
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:
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:
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.
ó = ×( × ) = ________________
ó
= = ___________________
×
b) Configurar el Timer 1
c) Cargar el Timer 1
d) Habilitar interrupciones
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
b) Cargar el Timer 1
c) Habilitar interrupciones
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:
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:
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:
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:
ó = × × ×
ó
=
× ×
9-17
www.mkelectronica.com Microcontroladores PIC: Nivel I
= × ×
=
×
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.
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
ó
= = _____________________
× ×
d) Habilitar interrupciones
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
ó
= = _____________________
× ×
d) Habilitar interrupciones
9-20
www.mkelectronica.com Microcontroladores PIC: Nivel I
AREA DE PRÁCTICAS
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.
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:
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.
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 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.
É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.
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.
E. DIGITALES
SALIDAS DIGITALES
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.
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.
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
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.
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á:
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”
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
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.
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.
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.
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
D0
D1
D2
D3
D4
D5
D6
D7
E
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
S6
S5
S4
S3
S2
S1
S0
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).
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.
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
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.
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.
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 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
S6
S5
S4
S3
S2
S1
S0
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.
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.
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).
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.
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
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.
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.
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.
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.
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.
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.
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.
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!
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
En las siguientes tablas tienes el juego completo de instrucciones. En cada columna se describe:
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
7
www.mkelectronica.com Microcontroladores PIC: Nivel I
Guía rápida de referencias
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
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
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
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
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
4.3 La Puerta C
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
11
www.mkelectronica.com Microcontroladores PIC: Nivel I
Guía rápida de referencia
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
Cuando el PIC está borrado todos sus bits se ponen a “1”. Es el valor por defecto.
13
www.mkelectronica.com Microcontroladores PIC: Nivel I
Guía rápida de referencia
Cuando el PIC está borrado todos sus bits se ponen a “1”. Es el valor por defecto.
14
www.mkelectronica.com Microcontroladores PIC: Nivel I
Guía rápida de referencia
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.
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.
15
www.mkelectronica.com Microcontroladores PIC: Nivel I
Guía rápida de referencia
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
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.
16
www.mkelectronica.com Microcontroladores PIC: Nivel I
Guía rápida de referencia
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
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).
19
www.mkelectronica.com Microcontroladores PIC: Nivel I
Guía rápida de referencia
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.
6.4 Interrupciones
20
www.mkelectronica.com Microcontroladores PIC: Nivel I
Guía rápida de referencia
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).
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
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:
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.
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:
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
PIE2 permite habilitar o no las interrupciones asociadas. Se han resaltado aquellos bits que afectan
a los periféricos estudiados en este curso:
24
www.mkelectronica.com Microcontroladores PIC: Nivel I
Guía rápida de referencia
Configura, entre otros, los diferentes modos de trabajo del Timer 0 (TMR0)
25
www.mkelectronica.com Microcontroladores PIC: Nivel I
Guía rápida de referencia
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.
Temporizador de 16 bits con prescaler de 1:1, 1:2, 1:4 y 1:8 y capacidad de interrupción
26
www.mkelectronica.com Microcontroladores PIC: Nivel I
Guía rápida de referencia
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.
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
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.
28
www.mkelectronica.com Microcontroladores PIC: Nivel I
Soluciones a los ejercicios propuestos
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.
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.
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.
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.
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.
S3-2
www.mkelectronica.com Microcontroladores PIC: Nivel I
Soluciones a los ejercicios propuestos
Vuelve a repetir el ejercicio pero sumando .49 + .207 (en hex 0x31 + 0xCF) y completando de nuevo
la tabla.
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.
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.
8. Vuelve a cambiar los valores. Ahora restarás .112 - .112 (0x70 – 0x70). Completa la tabla y razona
los resultados
S3-3
www.mkelectronica.com Microcontroladores PIC: Nivel I
Soluciones a los ejercicios propuestos
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.
S3-4
www.mkelectronica.com Microcontroladores PIC: Nivel I
Soluciones a los ejercicios propuestos
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.
Ahora tú
S4-1
www.mkelectronica.com Microcontroladores PIC: Nivel I
Soluciones a los ejercicios propuestos
Ahora tú
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
Restas
S4-2
www.mkelectronica.com Microcontroladores PIC: Nivel I
Soluciones a los ejercicios propuestos
P-4.2.4 Ahora tú
1. Cuánto tiempo tardan en ejecutarse las instrucciones necesarias para rellenar únicamente las
posiciones 0x30 y 0x31 del buffer? 14 µS
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?
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.
;Programa principal
Inicio clrf Salida ;Puesta a 0 inicial
movlw 0b00000001
Loop xorwf Salida,1 ;Función OR exclusiva
goto Loop ;Repite el chequeo
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
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.
S4-4
www.mkelectronica.com Microcontroladores PIC: Nivel I
Soluciones a los ejercicios propuestos
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.
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
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
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.
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
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.
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.
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
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.
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.
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ú
F3 (RB6)
S6-2
www.mkelectronica.com Microcontroladores PIC: Nivel I
Soluciones a los ejercicios propuestos
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
CONFIG2
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
S7-1
www.mkelectronica.com Microcontroladores PIC: Nivel I
Soluciones a los ejercicios propuestos
CONFIG2
OSCCON
Ejercicio 2
Codificar adecuadamente los bits que intervienen en los siguientes registros. El resto de bits déjalos
en sus valores por defecto.
CONFIG1
CONFIG2
OSCCON
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
CONFIG2
OSCCON
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
CONFIG2
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
S7-4
www.mkelectronica.com Microcontroladores PIC: Nivel I
Soluciones a los ejercicios propuestos
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
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.
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.
S8-1
www.mkelectronica.com Microcontroladores PIC: Nivel I
Soluciones a los ejercicios propuestos
Ejercicio 4
Activar la interrupción para el caso de que se detecte un fallo en el oscilador externo (FCSM)
b) Permisos generales
S8-2
www.mkelectronica.com Microcontroladores PIC: Nivel I
Soluciones a los ejercicios propuestos
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.
b) Calcular el valor que hay que cargar en el registro del Timer 0 (debe ser un número entero)
ó −
= = =
× ×
c) Cargar el TMR0
d) Habilitar la interrupción
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.
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
d) Habilitar la interrupción
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.
ó = ×( × )= × × = = "
ó
= = =
× ×
b) Configurar el Timer 1
c) Cargar el Timer 1
S9-2
www.mkelectronica.com Microcontroladores PIC: Nivel I
Soluciones a los ejercicios propuestos
d) Habilitar interrupciones
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
b) Cargar el Timer 1
c) Habilitar interrupciones
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
ó
= = =
× × × ×
d) Habilitar interrupciones
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
S9-4
www.mkelectronica.com Microcontroladores PIC: Nivel I
Soluciones a los ejercicios propuestos
ó
= = =
× × × ×
d) Habilitar interrupciones
S9-5
www.mkelectronica.com Microcontroladores PIC: Nivel I
Soluciones a los ejercicios propuestos
S9-6
www.mkelectronica.com Microcontroladores PIC: Nivel I