You are on page 1of 469

1

Introduccin

El objetivo principal de este libro es el de exponer, de principio a fin, todos y cada uno de los
aspectos tcnicos relacionados con la operacin de los microcontroladores PIC fabricados por
la empresa MICROCHIP TECHNOLOGY, INC.
Debido a que existen una gran variedad de modelos (catalogados bsicamente en 3 familias, la
serie 12C de 12 y 14 bits, la serie 16C de 14 bits y las series 17C y 18C de 16 bits), nos
concentraremos nicamente en la primera familia y en algunos modelos bsicos de la segunda,
con la finalidad de exponer sus caractersticas de manera ms detallada y facilitar as su
explicacin.
Cabe mencionar que este libro no pretende remplazar al manual de especificaciones tcnicas
(datasheet) de algn modelo de microcontrolador en especial sino que trata de complementarlo
al describir sus caractersticas generales de operacin con ms detalle, adems de hacerlo en
espaol.
El formato que ser empleado a lo largo de todo el libro consistir en que algunas palabras
tcnicas en el idioma ingls que no tengan una traduccin comprensible para ser entendidas
por su significado exacto, stas sean traducidas al espaol y posteriormente escritas en ingls,
presentando stas ltimas entre parntesis. As por ejemplo, si hacemos referencia a la
palabra en ingls stack, sta ser escrita como: pila (stack).
Diseando con el microcontrolador PIC esta escrito en un lenguaje sencillo, pudiendo ser
entendido por cualquier estudiante o ingeniero con conocimientos bsicos de electrnica digital,
sin que esto implique que el libro no tenga un buen nivel de conocimientos, ya que se pretende
que al terminar de estudiar este libro, el lector este capacitado para disear cualquier sistema
basado en los microcontroladores PIC. Obviamente esto no se cumple al pie de la letra ya que
adems del conocimiento tcnico del microcontrolador se requerir algo de prctica, pero no
obstante se tendr una muy buena referencia de cmo hacerlo, ayudado con el proyecto
completo que se presenta en el captulo 28, al final de este libro.
En los primeros captulos se presenta la informacin tcnica y de operacin tanto de la unidad
central de procesamiento (CPU), la distribucin de su memoria de programa (EPROM), la
memoria de registros (RAM), la de sus puertos de entrada/salida (I/O ports) as como la de sus
diferentes dispositivos o controladores perifricos.
En los captulos posteriores se presenta una descripcin detallada de todas y cada una de las
instrucciones con que cuenta la familia de microcontroladores, una explicacin general del uso
del lenguaje ensamblador as como una descripcin del sistema de desarrollo MPLAB que la
empresa MICROCHIP TECHNOLOGY, INC, a travs de su sitio de Internet
(www.microchip.com), pone a la disposicin de sus usuarios en forma gratuita.
Finalmente, mencionar que este libro esta basado en la informacin tcnica publicada por
MICROCHIP TECHNOLOGY INC. en su sitio de internet mencionado con anterioridad y el
autor de este libro da todo el crdito a dicha empresa y hace notar que todas las marcas
mencionadas en este libro, son marcas registradas.

Breve historia del nacimiento de los microcontroladores


En los aos setenta comenz a desarrollarse, de una manera prctica, la tecnologa de los
microprocesadores. En ese entonces, la capacidad de stos no rebasaba 8 bits del bus de
datos (data), su velocidad era limitada y no excedan de 1 MHz de velocidad de operacin.
Asimismo, su modo de direccionamiento de memoria era diferente a la que existe actualmente,
ya que, exista una sola memoria que compartan, tanto el programa (EPROM) como los datos
(RAM). No obstante, se podan direccionar hasta 64 Kbytes con sus 16 lneas del bus de
direcciones (address).
De esta manera, el microprocesador contenido en un circuito integrado de 40 pines era solo
una parte del sistema, ya que tanto la memoria de programa (EPROM) implementada en un
bloque de la capacidad total, as como la memoria de datos (RAM) implementada en otro
bloque de la misma memoria total, eran implementadas con circuitos integrados de varias
capacidades que podan ser de 256 bytes hasta 2 Kbytes en un principio. Asimismo, los
diferentes dispositivos perifricos deban implementarse con circuitos digitales (y analgicos)
que ocupaban un gran espacio y demandaban mayor consumo de energa. Todos estos
dispositivos, comunicados entre si mediante un bus de direcciones, un bus de datos y un bus
de control, contenidos en un solo circuito integrado forman lo que hoy se conoce como
microcontroladores.
La tecnologa fu avanzando a pasos agigantados y los llamados microprocesadores pasaron a
ser microcontroladores, y hoy en da podemos encontrar en el mercado un sin nmero de
marcas, opciones y capacidades de estos sistemas pero, como se menciono anteriormente,
implementados en un solo circuito integrado, con un consumo muy bajo de energa, una
velocidad de operacin mucho mayor y un costo muy reducido entre otras muchas ventajas.
Lo anterior nos permite que en la actualidad podamos disear sistemas mucho ms complejos,
ocupando menos espacio, consumiendo menos energa y manufacturndolos a un menor
costo.
Sin embargo, es importante aclarar que actualmente existen los microprocesadores de 16, 32 y
hasta 64 bits y fu solo una lnea de aplicacin la implementada como microcontroladores. Esta
lnea existe en varias versiones de 8 y 16 bits, con memoria de programa (EPROM) de hasta 8
Kbytes y memoria de datos (RAM) de hasta 1 kbyte, as como una gran variedad de
dispositivos perifricos (ver el sitio de internet www.microchip.com) para ver la informacin ms
actual.
La principal causa de la existencia de los microcontroladores es que existen aplicaciones
especficas que demandan recursos limitados y de ah que existan una gran variedad de
modelos con diferentes capacidades de memoria y de dispositivos perifricos. Esto se podr
entender con claridad una vez que se haya concluido la lectura de este libro.
El diseo de cualquier sistema de control requerir del seguimiento de los siguientes pasos:

Definicin del sistema a disear.


Este paso consiste en definir las caractersticas del sistema a disear, con el objeto de
elegir el modelo de microcontrolador adecuado que cumpla con los requerimientos del
sistema, es decir, responder principalmente a las siguientes preguntas:
Cules sern los parmetros o variables de entrada?
Cules sern los parmetros o variables de salida?
Cules sern los procesos a realizar?
Capacidad necesaria en memoria de programa (EPROM)?

Capacidad necesaria en memoria de datos (RAM)?


Cules sern los dispositivos perifricos necesarios?
Cul es la velocidad mxima y mnima del proceso?
Cul ser la frecuencia de operacin del microcontrolador?
El nmero y tipo de las entradas (analgica o digital)?
El nmero de las salidas?
Se requerir de memoria no voltil para guardar parmetros?
Qu corriente ser necesaria en los puertos de salida?
Qu voltajes de alimentacin sern utilizados?

Diseo de los circuitos de acoplamiento asociados a los puertos de


entrada/salida del microcontrolador.
Este paso consiste en disear los circuitos o interfases necesarias para acoplar las
seales de entrada y de salida a los puertos de entrada/salida (I/O ports) del
microcontrolador. Vemoslo con un ejemplo: Imaginemos que requerimos medir un
voltaje del tipo analgico cuyo rango de operacin que se encuentre entre 0 y 36 volts
de corriente directa (VDC). Es obvio que esta medicin no la podremos hacer en forma
directa ya que daaramos el circuito de entrada del microcontrolador porque
sobrepasara el voltaje de entrada mximo permitido. En este caso necesitaremos
acondicionar la seal de entrada mediante un divisor de voltaje (digamos dividir entre
10) para proporcionarle al puerto de entrada un voltaje mximo de 3.6V (36/10=3.6). En
este caso bastar con un par de resistencias cuya relacin sea de 10:1, por ejemplo
100K en serie con 10K para lograr dicha reduccin.
Es decir, existen una infinidad de casos que por razones obvias no describiremos en
este libro ya que el objetivo principal de ste no es ensear tcnicas de diseo de
interfaces sino la programacin del microcontrolador en el sistema a disear.

Diseo del programa de control (software)


Esta es probablemente la parte medular de la etapa del diseo del sistema en si,
aunque sin menospreciar la etapa del diseo de los circuitos (hardware).
En la etapa del diseo del programa de control deber estimarse, de una manera
aproximada, la capacidad, tanto de la memoria de programa (EPROM) como la
memoria de datos (RAM) necesarias para la correcta implementacin de la aplicacin,
pero hacindolo bajo el criterio de dejar libre (sin uso) un porcentaje de la misma, ya
que por causas en ocasiones no contempladas, es necesario hacer ajustes finales o
ampliaciones de ltima hora, impidindonos la conclusin satisfactoria del proyecto,
teniendo as que migrar a un modelo con mayor capacidad.
Otro aspecto importante de visualizar en esta etapa, es el criterio de optimizacin bajo
el cual ser diseado el programa de control (software), es decir, si ste ser
optimizado en velocidad (cuando el tiempo de ejecucin de algn proceso es
primordial) o en tamao de la memoria de programa usada (cuando la capacidad de
memoria es muy limitada), pero teniendo como prioridad el primero.
Por otra parte, existen dos tipos de mtodos empleados para registrar cualquier cambio
en las seales de entrada: Por interrupcin (interrupt) y por poleo (polling).
El primer mtodo es el ms usado y corresponde al uso de una rutina de interrupcin
que ser ejecutada una vez que se detecte una condicin especial, previamente
definida, interrumpiendo en ese mismo instante al proceso principal, ejecutndola y
regresando nuevamente el control al proceso principal interrumpido. Este mtodo

generalmente es el ms rpido y el que garantiza el registro de todos y cada uno de los


cambios de la seal de entrada.
El segundo mtodo es mucho ms fcil de implementar pero en ocasiones puede
esclavizar al proceso principal de control y en consecuencia, limitarlo en la ejecucin de
varias tareas al mismo tiempo.
Finalmente, existir en ocasiones la necesidad de realizar algunos clculos
matemticos y que por motivos del tiempo empleado en su ejecucin, no sea viable
hacerlo. En este caso se requerir del uso de algn algoritmo diseado especialmente
para remplazar a la rutina de clculo que opera con lentitud. Existen una gran variedad
de algoritmos o rutinas de ejecucin rpida disponibles en las notas de aplicacin del
sitio Web de la empresa fabricante MICROCHIP TECHNOLOGY, INC.

Programacin del microcontrolador


Una vez capturado el programa de control (software) de la aplicacin en el editor del
programa de desarrollo MPLAB, este deber ser ensamblado pare ser convertido a
lenguaje de mquina y guardado en un archivo .hex. Este proceso es ejecutado
automticamente por esta herramienta de desarrollo poderosa.
Despus de lo anterior, la informacin generada por el programa MPLAB estar lista
para su programacin en un microcontrolador virgen, es decir, no programado. Debido
a que en la etapa de desarrollo se requiere del proceso de programar y borrar el
microcontrolador varias veces a lo largo del desarrollo del sistema, podemos mencionar
que existen dos tipos de dispositivos utilizados para esta etapa: Uno del tipo de borrado
con luz ultravioleta (UV) y corresponden a los modelos con terminacin JW, los cuales
poseen una ventana transparente en el centro del circuito integrado y el segundo del
tipo reprogramable (FLASH), el cual puede ser borrado elctricamente desde el
programador.
En el primer caso, el usuario requerir de una lmpara que emita luz ultravioleta para
generar el borrado de los microcontroladores. Existen varios fabricantes de este tipo de
lmparas, pero una solucin ms rpida y econmica podra ser el utilizar una lmpara
germicida, es decir, una lmpara utilizada para la esterilizacin de instrumental
mdico.
Existen varios tipos de programadores de microcontroladores en el mercado, pero el
ms econmico y recomendado por la empresa MICROCHIP TECHNOLOGY, INC.,
para efectos de desarrollo de prototipos es el modelo PIC START PLUS, el cual es
conectado a una computadora personal (PC) a travs del puerto de comunicacin serial
(COM1). Este programador es manejado desde el programa de desarrollo MPLAB. Sin
embargo, este programador tiene un precio de aproximadamente $200 US dolares y
pudiera ser no muy accesible para algunos estudiantes, en cuyo caso existen otras
opciones ms econmicas, como por ejemplo el programador que vende las tiendas de
electrnica STEREN a un precio menor de $200 pesos. Cabe aclarar que este
programador se limita nicamente a algunos modelos de 8 y 18 pines, por lo que el
interesado deber preguntar en la tienda si el modelo de microcontrolador que
pretender usar en su proyecto se encuentra incluido en las opciones de este
programador.

Generalidades

En este captulo se describe la arquitectura de los microcontroladores PIC as como sus


caractersticas operativas.
Estructura de los microcontroladores PIC
Cada microcontrolador PIC esta integrado por algunos de los siguientes subsistemas
principales de acuerdo a su operacin:

Oscilador
Lgica de arranque (RESET)
Unidad central de procesamiento (CPU)
Unidad lgica y aritmtica (ALU)
Memoria de programa (EPROM)
Memoria de datos (RAM)
Puertos de entrada/salida (I/O PORTS)
Temporizador 0 (TIMER0)
Temporizador guardin (WATCHDOG TIMER)
Convertidor Anlogo/Digital de 8 bits (ADC)
Modulador de ancho de pulso (CPP)
Puerto serial sincrnico (SSP)
Transmisor/Receptor universal sincrnico/asncrono (USART)

En los siguientes prrafos sern descritos todos y cada uno de los subsistemas mencionados
anteriormente pero antes mencionaremos otros aspectos que debern ser tomados en cuenta
para seleccionar el modelo de microcontrolador adecuado.
Variedades de los dispositivos
Una vez que los requerimientos funcionales del dispositivo son especificados, algunas otras
decisiones debern ser tomadas:

Tecnologa de la memoria
Voltaje de operacin
Rango de la temperatura de operacin
Frecuencia de operacin
Empaquetado (Packaging)

Variedades de memoria
Antes que nada mencionaremos que la tecnologa empleada en la fabricacin de la memoria
no afectar su operacin lgica, es decir, cuando se haga referencia a la tecnologa de la
memoria o su rango de voltaje, implicar que estas circunstancias no influirn en la manera en
que sta opera.

MICROCHIP TECHNOLOGY, INC. ofrece tres diferentes tipos de memoria de programa, lo


cual es especificado en el nmero del modelo mediante la primera o primeras letras despus
de la designacin del tipo de familia. De esta manera tendremos:
1. C
2. CR
3. F

usado para designar el tipo EPROM


usado para designar el tipo ROM
usado para designar el tipo FLASH

(Ejemplo: 12Cxxx)
(Ejemplo: 12CRxxx)
(Ejemplo: 16Fxxx)

EPROM (Erasable Programable Read Only Memory)


Este tipo de memoria tiene la capacidad de ser programada y borrada por el usuario y es muy
usada en la etapa de desarrollo de proyectos.
ROM (Read Only Memory)
Este tipo de memoria es de solamente lectura y el cdigo del programa contenido en esta es
cargado en el momento de su fabricacin. Tiene la ventaja de que pueden producirse en altos
volmenes y ahorrar tiempo de programacin en las lneas de produccin. Sin embargo, este
tipo de tecnologa es muy poco flexible en cuanto a actualizaciones se refiere ya que tiene la
desventaja de que si hubiese algn cambio de versin en el programa, todo el inventario ya
producido quedara inservible, lo que representara una gran prdida econmica.
FLASH
Este tipo de memoria es la ms verstil de todas ya que, debido a que es elctricamente
borrable, esta puede ser programada en las lneas de produccin sin desmontar el circuito.
Tambin puede ser usada en la etapa de desarrollo. El problema radica en que no todos los
modelos de microcontroladores son fabricados con este tipo de memoria y los que si la poseen
son de ms alto costo.
Opciones del rango de voltaje de operacin
Todos los microcontroladores operan bajo un rango de voltaje estndar. Sin embargo existen
una serie especial que operan con un rango de voltaje extendido (y en consecuencia un rango
de frecuencia reducida). Este tipo de memorias presentan en el nmero de modelo la letra L
justo despus del nmero de familia. Por ejemplo:
1. PIC12LCxxx
2. PIC16LCRxxx
3. PIC16LFxxx
El rango de voltajes de operacin, de acuerdo al tipo de memoria, se presenta a continuacin:
Estndar:

C
CR
F

4.5V 6.0V
4.5V 6.0V
4.5V 6.0V

Extendido:

LC
LCR
LF

2.5V 6.0V
2.5V 6.0V
2.0V 6.0V

Variedades de empaquetado
Existen tres diferentes tipos de empaquetado de los microcontroladores PIC, y ser
dependiendo de la fase en que se encuentre el desarrollo de la aplicacin, el que deber ser
elegido.
El primer tipo de empaquetado es cermico y corresponde a dispositivos con ventana
transparente necesaria para ser borrados mediante emisiones de luz ultravioleta. Este tipo de
empaquetado es utilizado principalmente en la etapa de desarrollo debido a que la memoria de
programa (EPROM) puede ser borrada y reprogramada en repetidas ocasiones.
El segundo tipo de empaque es de plstico de muy bajo costo y es utilizado en la etapa de
produccin.
Por ultimo existe el empaque denominado DIE, el cual en realidad carece de encapsulado.
Este tipo de empaque es muy utilizado en aplicaciones de muy bajo costo as como en
aplicaciones donde el espacio en primordialmente reducido.
Dispositivos borrables con luz ultravioleta (UV)
La versin de dispositivos de memoria de programa (EPROM) borrables con luz ultravioleta es
usada en forma ptima en el desarrollo de prototipos y programas piloto.
El tiempo requerido para borrar completamente un dispositivo vara de acuerdo a la longitud de
onda de la luz, la distancia de la fuente de luz ultravioleta y la tecnologa del proceso de
fabricacin del dispositivo (que tan pequeas son las celdas de memoria).
NOTA: Es importante mencionar, que tanto la luz fluorescente como la luz solar emiten luz
ultravioleta en la longitud de onda de borrado, por lo cual deber ser una prctica importante,
cubrir la ventada del dispositivo con alguna etiqueta opaca, con el objeto de prevenir, con el
paso del tiempo, que algunas de las celdas de memoria sean borradas de manera accidental.
El tiempo de borrado para la luz fluorescente es de aproximadamente tres aos mientras que
para la luz solar es de una semana.
Dispositivos programables una sola vez (OTP)
Este tipo de dispositivos, empaquetados en plstico, es muy til en lneas de produccin donde
existe la posibilidad de tener cambios en el cdigo del programa de control (software). Como su
nombre lo indica, stos solo pueden ser programados una sola vez (one time programmable)
(OTP).
Dispositivos reprogramables (FLASH)
Un dispositivo reprogramable (FLASH) permite que su memoria sea cambiada mediante una
carga elctrica. Esto permite que ste pueda ser borrada y reprogramada an estando
montado en el circuito impreso. Este tipo de dispositivo es empaquetado en plstico de bajo
costo.
A pesar de que esta presentacin es la mejor, lamentablemente no todos los modelos la tienen,
pero los modelos que la tienen, su costo es ms elevado.

Dispositivos elctricamente borrables (EEPROM)


Un dispositivo elctricamente borrable (EEPROM) permite que su memoria sea borrada
mediante una carga elctrica. Esto permite que ste pueda ser reprogramada an estando
montado en el circuito impreso. Este tipo de dispositivo es empaquetado en plstico de bajo
costo.
Dispositivos de solamente lectura (ROM)
Este tipo de dispositivos son programados en el momento de su fabricacin, lo que los hace
aun ms econmicos ya que adems de su encapsulado de plstico de bajo costo, ahorran el
costo del tiempo empleado en su programacin en la lnea de produccin. Sin embargo, tienen
la desventaja de no poder ser utilizados en caso de alguna revisin en el cdigo del programa
de control (software).

Oscilador

En este captulo se describir con detalle todo lo referente al oscilador interno del
microcontrolador PIC, entendiendo por oscilador, el circuito utilizado para generar la seal de
reloj (clock). Esta seal equivale a lo que llamaramos el marca pasos del sistema. Este reloj
(clock) es requerido para que el microcontrolador ejecute las instrucciones y los perifricos
puedan funcionar.
Un ciclo de reloj de instruccin (internal instruction clock cycle) (Tcy) es generado con cuatro
periodos de reloj.
Este circuito oscilador podr ser programado, mediante los bits de configuracin (configuration
bits), para operar en uno de ocho diferentes modos dependiendo de su valor. Estos bits de
configuracin se encuentran contenidos en una posicin de memoria no voltil, la cual es
escrita en el momento de la programacin del microcontrolador. Los modos del oscilador son
los siguientes:

LP

Cristal de baja frecuencia (Potencia)


(Low Frequency (Power) Crystal)

XT

Cristal/Resonador
(Crystal/Resonator)

HS

Cristal/Resonador de alta velocidad


(High Speed Crystal/Resonador)

RC

Resistencia/Capacitor externos
(External Resistor/Capacitor)

EXTRC

Resistencia/Capacitor externos
(External Resistor/Capacitor)

EXTRC

Resistencia/Capacitor externos con seal CLKOUT


(External Resistor/Capacitor with CLKOUT)

INTRC

Resistencia/Capacitor internos de 4 MHz


(Internal 4 MHz Resistor/Capacitor)

INTRC

Resistencia/Capacitor interno de 4 MHz con seal CLKOUT


(Internal 4 MHz Resistor/Capacitor with CLKOUT)

Estas opciones del oscilador son disponibles para hacer al microcontrolador suficientemente
flexible y ste pueda ser utilizado en muy diversas aplicaciones.
Las opciones del tipo RC nos permiten tener ahorros en costo, mientras que la opcin LP nos
permite tener ahorros en consumo de potencia.

Configuraciones del oscilador


Tipos de osciladores
Los microcontroladores de la serie 12Cxxx de 12 y 14 bits, poseen nicamente 4 modos
diferentes de operacin del oscilador (programados mediante dos bits de configuracin FOSC1
y FOSC0), mientras que la familia de la serie 16Cxxx poseen 8 modos (programados mediante
tres bits de configuracin FOSC2 FOSC1 y FOSC0).
La principal diferencia entre los modos LP, XT y HS es la ganancia del inversor interno del
circuito del oscilador, el cual permite su operacin a diferentes rangos de frecuencia. Las tablas
3.1 y 3.2 nos proporcionan suficiente informacin para la seleccin de un modo de operacin
del oscilador.
El uso de la opcin del oscilador con ms baja ganancia resultar en ms bajas corrientes
dinmicas (IDD) y en consecuencia en un ahorro en el consumo de potencia.
El modo RC as como los modos EXTRC con seal CLKOUT tienen la misma funcionalidad.
Ellos son nombrados as para ayudar a describir su operacin comparndolos con los otros
modos.
Tabla 3.1:
FOSC1:FOSC0

Seleccin del modo del oscilador para la serie 12Cxxx


Modo

Ganancia

Comentario

11

RC

---

Solucin ms econmica
(Solo un capacitor y una
resistencia externas).

10

HC

Alta

Para aplicaciones de alta


frecuencia. Es el que ms
corriente consume.

01

XT

Media

Para frecuencia de cristal


estndar. Consumo de
corriente medio.

00

LP

Baja

Para aplicaciones de baja


frecuencia/ bajo consumo
de potencia.

10

Tabla 3.2:
FOSC2:FOSC0

Seleccin del modo del oscilador para la serie 16Cxxx


Modo

Ganancia

Comentario

111

EXTRC
CLKOUT

---

Solucin econmica.
Mucha variacin en la base
de tiempo. CLKOUT es habilitado
sobre el puerto de e/s (I/O pin).

110

EXTRC

---

Solucin econmica.
Mucha variacin en la base de
tiempo. CLKOUT es inhibido
sobre el puerto de e/s (I/O pin).

101

INTRC
CLKOUT

---

Solucin mas econmica.


Oscilador de 4 MHz (calibrable)
CLKOUT es habilitado sobre el
Puerto de e/s (I/O pin).

100

INTRC

---

Solucin ms econmica.
Mucha variacin en la base
de tiempo. CLKOUT es inhibido
sobre el puerto de e/s (I/O pin).

011

---

---

Reservada.

010

HS

Alta

Aplicaciones de alta frecuencia.


El que ms corriente consume.

001

XT

Media

Frecuencia de cristal estndar.


Consumo de corriente medio.

000

LP

Baja

Aplicaciones de baja frecuencia


y bajo consumo de potencia.

Osciladores de Cristal / Resonadores cermicos


En los modos XT, LP o HS un cristal o un resonador cermico es conectado en los pines OSC1
y OSC2 para establecer la oscilacin del microcontrolador (figura 3.1). El diseo del oscilador
requerir del uso de un cristal de corte paralelo (parallel cut crystal) ya que si se utilizara un
cristal de corte serie (series cut crystal) pudiera salirse de la frecuencia de resonancia y no
cumplir con las especificaciones requeridas.
En los modos XT, LP o HS, una fuente de reloj externa puede ser proporcionada sobre el pin
de entrada OSC1 (figura 3.1).

11

Figura 3.1:

Operacin con cristal o resonador cermico


en los modos HS, XT o LP

Arranque del oscilador / resonador


El arranque del oscilador comenzar su operacin conforme el voltaje de alimentacin VDD se
incremente a partir de la referencia Vss. El tiempo requerido para que el oscilador comience a
oscilar depende de varios factores:

Frecuencia del cristal / resonador.


Valores de los capacitares usados (C1 y C2 en la figura 3.1).
Tiempo de ascenso del voltaje de polarizacin VDD.
Temperatura del sistema.
Valor de la resistencia en serie Rs si es utilizada (figura 3.1).
Modo de operacin del oscilador seleccionado, el cual selecciona la ganancia del
inversor interno del circuito del oscilador.
Calidad del cristal
Diseo de las pistas del oscilador en el circuito impreso.
Ruido del sistema.

Como puede observarse existen una gran variedad de circunstancias que hacen que vare el
comportamiento de arranque del circuito oscilador pero no es motivo de preocupacin, ya que
en realidad no es de mayor trascendencia en la generalidad de las aplicaciones.
La figura 3.2 nos muestra una grfica del comportamiento de arranque del circuito oscilador.
Figura 3.2 Ejemplo de las caractersticas de arranque del oscilador

12

Seleccin de los componentes


La figura 3.1 nos muestra un diagrma elctrico del circuito del cristal o resonador cermico
del microcontrolador. El valor de la resistencia interna de retroalimentacin (feedback) RF, se
encuentra tpicamente entre el rango de los 2 a los 10 Mohms. La resistencia en serie RS,
puede ser requerida con cierto tipo de cristales, pero en general no es utilizada. Los valores
tpicos de los capacitares C1 y C2 debern ser elegidos de acuerdo al modo de operacin del
oscilador y la frecuencia del oscilador utilizada.
Seleccin de capacitares C1 y C2 para osciladores con resonadores cermicos.
Para el modo XT operando a una frecuencia de 455 KHz se recomienda usar C1, C2 con
valores de 15 pf -100 pf.
Para el modo XT operando a una frecuencia de 2.0 MHz se recomienda usar C1, C2 con
valores de 15 pf - 68 pf.
Para el modo XT operando a una frecuencia de 4.0 MHz se recomienda usar C1, C2 con
valores de 15 pf - 68 pf.
Para el modo HS operando a una frecuencia de 8.0 MHz se recomienda usar C1, C2 con
valores de 10 pf -68 pf.
Para el modo HS operando a una frecuencia de 16.0 MHz se recomienda usar C1, C2 con
valores de 10 pf - 22 pf.
Para el modo HS operando a una frecuencia de 20.0 MHz se recomienda usar C1, C2 con
valores de 10 pf.
Seleccin de capacitares C1 y C2 para osciladores con cristal.
Para el modo LP operando a una frecuencia de 32 KHz se recomienda usar C1, C2 con valores
de 68 pf - 100 pf.
Para el modo LP operando a una frecuencia de 200 KHz se recomienda usar C1, C2 con
valores de 15 pf - 30 pf.
Para el modo XT operando a una frecuencia de 100 KHz se recomienda usar C1 de 68 pf 150
pf y C2 de 150 pf - 200 pf.
Para el modo XT operando a una frecuencia de 2 MHz se recomienda usar C1, C2 con valores
de 15 pf - 30 pf.
Para el modo XT operando a una frecuencia de 4 MHz se recomienda usar C1, C2 con valores
de 15 pf - 30 pf.
Para el modo HS operando a una frecuencia de 8 MHz se recomienda usar C1, C2 con valores
de 15 pf - 30 pf.
Para el modo HS operando a una frecuencia de 10 MHz se recomienda usar C1, C2 con
valores de 15 pf - 30 pf.
Para el modo HS operando a una frecuencia de 20 MHz se recomienda usar C1, C2 con
valores de 15 pf - 30 pf.

13

Calibrando el circuito oscilador


Debido a que los microcontroladores operan sobre amplios rangos de frecuencia, voltaje y
temperatura, dependiendo de la parte y versin usada y tambin de la variacin de las
componentes tales como cristales, capacitores, etc., y estos a su vez variando en calidad y
manufactura, es necesario asegurar su operacin adecuada mediante la validacin de estos
componentes para que cumplan con los requerimientos de la aplicacin.
Existen una gran variedad de factores que intervienen en la seleccin, tales como:

Ganancia del amplificador


Frecuencia deseada
Frecuencia de resonancia del cristal
Temperatura de operacin
Rango de la fuente de voltaje
Tiempo de arranque
Estabilidad
Tiempo de vida del cristal
Consumo de potencia
Simplificacin del circuito
Uso de componentes estndar
Etc.

Determinando los valores ptimos para los cristales, el modo de operacin del oscilador,
C1, C2 y Rx.
El mejor mtodo para la seleccin de componentes es la aplicacin de un conocimiento bsico
y una gran cantidad de mediciones y pruebas.
Cristales
Estos son usualmente seleccionados nicamente por su frecuencia de resonancia en paralelo,
pero sin embargo existen otros parmetros importantes para su diseo, tales como la
temperatura y la tolerancia en frecuencia. La nota de aplicacin AN588 de MICROCHIP
TECHNOLOGY, INC. es una excelente referencia para conocer ms acerca de la operacin de
los cristales.
El circuito del oscilador interno de los microcontroladores PIC es uno del tipo paralelo, por lo
que tambin es necesario seleccionar un cristal del mismo tipo y la capacitancia de carga es
usualmente especificada en el rango de 20 a 32 pf.
El modo de operacin del reloj (clock mode) es elegido principalmente con la especificacin del
parmetro FOSC basado en la frecuencia. Los modos de operacin del reloj (exceptuando RC)
son simplemente seleccin de ganancias, bajas ganancias para bajas frecuencias y altas
ganancias para altas frecuencias.
C1 y C2 deber ser seleccionado de la manera anteriormente expuesta. Un mtodo para
mejorar el arranque del oscilador es utilizar un valor de C2 mayor que C1. Esto causar un
mayor corrimiento de fase en el encendido y acelerar su arranque.

14

Arranque del oscilador


El momento ms difcil en el arranque del oscilador se presenta cuando ste es despertado
(wake up) de un estado de reposo (sleep). Esto es principalmente porque los capacitares de
carga se encuentran ligeramente cargados y la diferencia de fase es mnima al despertar. Por
lo anterior, mayor tiempo ser requerido para estabilizar la oscilacin. Hay que recordar
tambin que a bajo voltaje, alta temperatura y modos de operacin del reloj a frecuencias
bajas, imponen limitaciones sobre la ganancia de la malla (loop gain) y esta a su vez afecta el
arranque. La siguiente es una lista de factores que afectan el arranque:

Diseos de baja frecuencia (con su modo de reloj con baja ganancia)


Un ambiente quieto (tal como un dispositivo operado por bateras)
Operando fuera de un rea ruidosa en RF (tal como una caja blindada)
Bajo voltaje
Alta temperatura
Despertando de un estado de reposo

El ruido en realidad ayuda al arranque del oscilador.


Entrada del reloj externo (External clock input)
Si el oscilador interno del microcontrolador no se usara y ste fuese alimentado por un reloj
(clock) externo, es necesario asegurarse de configurar el modo de operacin del reloj como si
se usara un cristal (LP, XT o HS), es decir, algo diferente al del modo RC, ya que ste modo
inyectar la entrada. La figura 3.3 nos muestra este caso.
Figura 3.3

Operacin de entrada de reloj externo

Circuito del oscilador con cristal externo


En ocasiones es necesario alimentar con una seal de reloj a ms de un dispositivo a partir de
un cristal. Sin embargo esta prctica no es recomendada por el fabricante MICROCHIP. En
este caso se aconseja un circuito oscilador externo. De esta manera cada dispositivo tendr su
fuente de reloj y cada una de estas fuentes podr manejar tantas cargas como su capacidad de
amplificacin lo permita. Este circuito es tambin til en el caso que dos o ms
microcontroladores necesiten operar sincronizados uno con el otro.
Existen dos opciones, una de ellas es utilizar un circuito oscilador contenido en un circuito
integrado o chip previamente manufacturado, o bien una segunda consistente en un circuito
oscilador simple con compuertas TTL. En este caso, obviamente la primera opcin tendr un
ms amplio rango de operacin as como una mejor estabilidad.

15

La figura 3.4 muestra la implementacin de un circuito oscilador externo resonante en paralelo


mientras que la figura 3.5 nos muestra uno resonante en serie.
Figura 3.4

Circuito oscilador externo resonante en paralelo

Figura 3.5

Circuito oscilador externo resonante en serie

Cuando el microcontrolador es alimentado con un reloj externo tal y como muestran las figuras
3.4 y 3.5, entonces ste deber ser configurado para operar en modo LP, XT o HS.
Oscilador RC externo
Para las aplicaciones que no sean sensibles al tiempo, la opcin EXTRC ofrece un ahorro
adicional en costo. La frecuencia del oscilador del tipo RC es una funcin de: El voltaje de
alimentacin, la resistencia externa (REXT), el capacitor externo (CEXT) y la temperatura de
operacin. Adicionalmente a esto, la frecuencia del oscilador variar de unidad a unidad debido
a la variacin de los procesos de fabricacin de los componentes. Es ms, an el tipo de
empaquetado de la capacitancia de CEXT afectar la frecuencia de oscilacin, especialmente
para valores bajos. Las tolerancias de estos componentes debern ser tomadas en cuenta
tambin. La figura 3.6 nos muestra la manera de conectar este tipo de oscilador. Sin embargo
es importante hacer notar que para valores de REXT menores a 2.2 Kohms, la operacin del
oscilador podr venir a ser inestable o parar completamente. Asimismo, para valores de REXT
muy altos (como por ejemplo 1 Mohms), la operacin del oscilador vendr a ser sensible al

16

ruido y humedad. Por lo anterior, el valor de la REXT recomendado deber estar entre el rango
de 3 y 100 Kohms.
Figura 3.6

Oscilador del modo EXTRC

Aunque el oscilador podra operar sin un capacitor externo (CEXT = 0 pf), se recomienda usar
valores mayores a 20 pf por razones de estabilidad y ruido, ya que usando valores menores o
sin capacitores, la frecuencia de oscilacin podra variar dramticamente debido a cambios en
capacitancias externas tales como las contenidas en las pistas del circuito impreso (PCB), as
como las del empaquetado del circuito.
Por otra parte, la frecuencia del oscilador dividida por 4 se encuentra disponible sobre el pin
OSC2 / CLKOUT y puede ser usado para prueba del mismo o para sincronizar algn otro
circuito lgico (figura 5.3).
Arranque en RC
Cuando es usado el modo RC, este iniciar su oscilacin inmediatamente despus de que el
voltaje de alimentacin alcance el umbral de entrada de acuerdo a las especificaciones
elctricas del microcontrolador. Es decir, el circuito comenzar a oscilar de acuerdo al
incremento de voltaje de alimentacin. El tiempo requerido para que el RC comience a oscilar
depender de muchos factores entre los que se encuentran:

El valor de resistencia utilizada


El valor de capacitancia utilizada
El tiempo de levantamiento del voltaje de alimentacin VDD
La temperatura del sistema

Oscilador RC interno de 4 MHz


El oscilador RC interno (no disponible en todos los modelos) proporciona un reloj fijo de 4 MHz
nominal operando con VDD = 5V y 25 C (ver especificaciones tcnicas del microcontrolador en
uso).
Para contrarrestar alguna variacin producida en el oscilador, existe un registro OSCCAL cuyo
valor es utilizado para calibrar la frecuencia del oscilador RC interno. El valor de calibracin que
MICROCHIP programa dentro del microcontrolador compensar las variaciones de frecuencia
del oscilador provocadas por variaciones en el proceso de manufactura. Los bits CAL3:CAL0
son usados para una calibracin fina dentro de una ventana de frecuencia.

17

Valores ms altos en los bits CAL3:CAL0 (de 0000 a 1111) producir un reloj ms veloz.
Cuando la frecuencia de 4 MHz no pueda ser obtenida del ajuste de los bits CAL3:CAL0,
entonces ser necesario incrementar o decrementar los bits CALFST o CALSLW, los cuales
son usados para obtener un ajuste (offset) positivo o negativo del valor de la ventana de
frecuencia mencionada anteriormente. As, prendiendo el bit CALFST nos permite ajustar el
oscilador a una mayor frecuencia mientras que si prendemos el bit CALSLW nos permite
ajustar el oscilador a una menor frecuencia. Despus de un ciclo de arranque (RESET) del
microcontrolador, el registro OSCCAL es forzado al valor medio (CAL3:CAL0 = 7, CALFST = 0
y CALSLW = 0).
Registro OSCCAL

Bit7:4

CAL3:CAL0: Bits de calibracin del oscilador RC interno


0000 = Frecuencia ms baja dentro del rango, mientras que
1111 = Frecuencia ms alta dentro del rango.

Bit3

CALFST:
Bit de ajuste (offset) del rango del oscilador
1 = Incrementa la frecuencia del oscilador RC interno dentro de la
ventana acotada por CAL3:CAL0.
0 = No ajuste (offset)

Bit2

CALSLW:
Bit de ajuste (offset) del rango del oscilador
1 = Decrementa la frecuencia del oscilador RC interno dentro de
la ventana acotada por CAL3:CAL0.
0 = No ajuste (offset)

Bit1:0

No implementados:

Ledos como 0

Nota: Estos bits debern ser escritos como 0 cuando sea


modificado el registro OSCCAL para compatibilidad con futuros
modelos.
R = Bit de lectura
W = Bit de escritura
U = Bit no implementado, ledo como 0
- n = Valor que toma en el arranque (Power on Reset) (POR)
Nota:

El registro OSCCAL es usado para calibrar el oscilador RC interno del


microcontrolador provocado por las variaciones del proceso. El valor
del registro OSCCAL no debera ser modificado del valor
proporcionado por MICROCHIP y todos los ajustes necesarios debern
ser hechos por el programa (software) de aplicacin.

La figura 3.7 muestra las posibles frecuencias del microcontrolador a partir de un punto
descalibrado (a VDD = 5V, 25 C y OSCCAL = 70h), as como los cambios realizables por el
registro OSCCAL.

18

Figura 3.7

Frecuencia ideal del oscilador RC interno vs. Valor OSCCAL

La figura 3.8 muestra un ejemplo de un microcontrolador donde mediante la seleccin de uno


de los valores CAL3:CAL0, la frecuencia de oscilacin puede ser corregida a 4 MHz. Estos bits
pueden ser considerados como un fino ajuste de la frecuencia. Algunas veces la frecuencia del
microcontrolador en un punto descalibrado no puede ser corregido a 4 MHz mediante el ajuste
fino de los valores de los bits CAL3:CAL0. Es entonces cuando son usados los otros 2 bits
disponibles, el CALSLW y el CALFST, los cuales permiten un ajuste de mayor rango (positivo o
negativo) para mover la frecuencia dentro del rango en el cual el ajuste fino pueda trabajar. La
accin de estos bits puede ser apreciada en las figuras 3.9 y 3.10.
Figura 3.9

Ajuste positivo CALFST de la frecuencia del oscilador RC

19

Figura 3.10

Ajuste negativo CALSLW de la frecuencia del oscilador RC

Una instruccin de calibracin es programada en la ltima direccin de la memoria de


programa. Esta instruccin contiene el valor de calibracin para el oscilador RC interno. Este
valor es programado como una instruccin RETLW XX, donde XX es el valor de calibracin.
Para disponer de este valor deber usarse la instruccin CALL YY, donde YY corresponde a la
ltima direccin de la memoria de programa del microcontrolador. Una vez ejecutada esta
instruccin, el valor ser cargado en el registro W. Posteriormente deber ejecutarse la
instruccin MOVWF OSCCAL para cargar este valor en el registro de calibracin del oscilador
RC interno. La tabla 3.5 muestra la localidad del valor de calibracin dependiendo del tamao
de la memoria de programa.
Tabla 3.5:

Localidad del valor de calibracin

Nota 1:

Observe que cuando es borrado un microcontrolador de ventana con luz UV,


tambin ser borrado su valor de calibracin programado en ste, por lo que
antes de hacerlo deber salvar dicho valor. Una buena prctica es el escribir el
valor de calibracin sobre su empaque. As, este valor podr ser reprogramado
en la prxima programacin.

Nota 2:

Los bits de OSCCAL <1:0> no se encuentran implementados y debern ser


escritos como 0. Esto ayudar a asegurar la compatibilidad con futuros
modelos.

20

Reloj de salida (CLOCK OUT)


El oscilador RC interno puede ser configurado a proporcionar una seal de reloj de salida sobre
el pin CLKOUT, mediante la programacin de la direccin de la palabra de configuracin
(Configuration word) 2007h. As, los bits FOSC2, FOSC1, FOSC0 debern ser programados
como 101 para seleccionar un oscilador RC interno, o bien, 111 para un oscilador RC
externo.
La seal CLKOUT, la cual es dividida por 4, es utilizada para propsitos de prueba o para
sincronizar algn otro circuito lgico.
Cuando el valor de calibracin del oscilador RC interno es borrado accidentalmente, la opcin
de CLKOUT permitir determinar cual debera ser el valor de calibracin. Esto se logra
escribiendo un programa que modifique (incrementar / decrementar) el valor del registro
OSCCAL. As, cuando la seal CLKOUT sea de 1 MHz (1.5%) a 5V, 25 C, entonces el valor
del registro OSCCAL tendr el valor de calibracin correcto. Este valor deber ser presentado
en un puerto o enviado serialmente para su posterior programacin.
Efectos del modo de reposo (sleep) sobre el oscilador interno del microcontrolador.
Cuando el microcontrolador ejecute una instruccin SLEEP, el reloj y el oscilador de ste son
apagados y el dispositivo es mantenido al inicio de un ciclo de instruccin (estado Q1). Con el
oscilador apagado, las seales de los pines OSC1 y OSC2 dejaran de oscilar. Debido a que
todas las corrientes de los transistores han sido removidas, el estado de reposo (sleep) ser el
que logre el menor consumo de corriente (slo corrientes de fuga). As pues, habilitando
cualquier opcin que opere en el modo de reposo (sleep) aumentar el consumo de corriente.
El usuario podr despertar el microcontrolador de su estado de reposo (sleep) mediante una
seal externa de arranque (Reset), el arranque del temporizador de guardia (Watchdog Timer
Reset) o por una interrupcin.
Efectos del arranque (Reset) sobre el oscilador interno del microcontrolador.
El arranque (Reset) del microcontrolador no tiene ningn efecto sobre el oscilador interno. El
oscilador continuar operando normalmente. Mientras el microcontrolador permanece en la
condicin de arranque (Reset) la lgica se mantendr en el estado Q1 de manera tal que
cuando ste salga de esta condicin, ste se encuentre en el inicio de un ciclo de instruccin.
El pin OSC2, cuando sea usado como una seal de reloj de salida (modo EXTRC), ser
mantenido en un estado bajo durante el arranque (Reset) y tan pronto como el pin MCLR se
encuentre a un voltaje alto (VIH), el oscilador RC comenzar a operar.
Retardos al encendido (power-up)
Existen dos temporizadores (timers) que proporcionan retardos en el momento del encendido
(power-up) del microcontrolador. Uno de ellos es el temporizador de arranque del oscilador
(OST), el cual mantendr el microcontrolador en el estado de arranque (Reset) hasta que el
oscilador de cristal se encuentre estable. El otro temporizador es el de encendido (PWRT), el
cual proporciona un retardo fijo de 72 milisegundos (nominal) durante el encendido (POR y
BOR) con la finalidad de mantener al microcontrolador en el estado de arranque (Reset)
mientras se estabiliza la fuente de poder. Con estas dos opciones, muchas aplicaciones no
requerirn de circuitos de arranque externos.

21

22

Arranque (RESET)

La lgica de arranque (Reset) es utilizada para poner al microcontrolador en un estado


conocido. Existen varias fuentes que generan un estado de arranque (Reset), las cuales
pueden ser determinadas mediante los bits de estado (status) del dispositivo. La lgica de
arranque (Reset) fu diseada con caractersticas tales que reducen el costo del sistema e
incrementan la confiabilidad del mismo. Existen varias clases de arranque (Reset):

Arranque de encendido (Power-on Reset) (POR).


Arranque mediante el pin MCLR durante operacin normal.
Arranque mediante el pin MCLR durante el estado de reposo (Sleep).
Arranque mediante el temporizador de guardia (Watchdog timer) durante operacin
normal.
Arranque del tipo Brown-out (BOR)
Arranque por deteccin de error de paridad (Parity Error Reset) (PER).

Muchos registros no son afectados por una condicin de arranque (Reset); su estado (status)
es desconocido bajo una condicin de arranque del tipo POR y sin cambio para los otros tipos
de condicin de arranque. Los registros restantes son forzados a un estado de arranque
(Reset) bajo todo tipo de condiciones de arranque.
Los bits de paridad (Parity bits) pueden ser usados para verificar el contenido de la memoria de
programa.
Muchos registros no son afectados bajo la condicin de despertar del temporizador de guardia
(WDT wake-up) debido a que ste es visto como una conclusin de la operacin normal. Los
bits de estado (status) TO, PD, POR, BOR y PER son prendidos o apagados de acuerdo a
diferentes condiciones de arranque, segn se indica en la tabla 4.2. Estos bits son empleados
por el programa de control (software) para determinar cual fu la naturaleza de la condicin de
arranque (Reset) ocurrida. Ver la tabla 4.4 para observar una completa descripcin del estado
de los registros bajo esta condicin.
En la figura 4.1 se muestra un diagrma de bloques simplificado del circuito de arranque
(Reset) contenido en el microcontrolador. Este diagrma de bloques es generalizado y contiene
todos los tipos de arranque, por lo que deber revisarse las especificaciones tcnicas del
modelo de microcontrolador utilizado para ver que tipos de arranque son disponibles.
Recuerde que mientras el microcontrolador se encuentre en el estado de arranque (Reset), la
fase del reloj interno se mantendr en Q1 (al inicio del ciclo de instruccin). Asimismo es
importante sealar que el pin MCLR de entrada contiene un filtro para rechazar ruido y algunos
pulsos pequeos.

23

Figura 4.1

Nota

Diagrma de bloques simplificado del circuito de arranque

1: Este es un oscilador independiente al oscilador RC del pin CLKIN o el oscilador INTRC.


2: Las caractersticas de las cajas punteadas no son disponibles en todos los modelos.
3. En algunos modelos, este pin puede ser configurado como un puerto de entrada.
4. En modelos antiguos, el bit de configuracin es definido como PWRTE = 1 como habilitado
(enabled), mientras que en los modelos recientes PWRTE = 0 como habilitado (enabled).

Arranque de encendido (Power-on Reset) (POR)


Un pulso de arranque de encendido (POR) es generado en el microcontrolador cuando es
detectado un levantamiento del voltaje de alimentacin VDD. Para tomar ventaja de este tipo de
arranque, conecte el pin MCLR a VDD a travs de una resistencia como se muestra en la figura
4.2. Esto eliminar las componentes externas necesarias para crear un arranque de encendido.
Ver especificaciones tcnicas del modelo utilizado.

24

Figura 4.2

Utilizando el tipo de arranque POR

Cuando el microcontrolador salga de la condicin de arranque (Reset) (inicio de la operacin


normal), los parmetros de operacin tales como voltaje, temperatura, frecuencia, etc. debern
estar dentro de los rangos permisibles de acuerdo a las especificaciones tcnicas del
microcontrolador.
La figura 4.3 muestra un posible circuito POR para una rampa de voltaje de alimentacin lenta.
El circuito externo es necesario nicamente si la rampa es demasiado lenta. El diodo D
ayudar a descargar rpidamente al capacitor C cuando el voltaje de alimentacin VDD caiga.
Figura 4.3 Circuito externo de arranque de encendido para rampa lenta

Temporizador del voltaje de alimentacin al encendido (Power-up Timer) (PWRT)


Este temporizador genera un retardo de 72 milisegundos sobre el arranque de encendido
(POR) o sobre el arranque Brown-out (BOR). Ver parmetros en las especificaciones tcnicas
del microcontrolador a usar. El temporizador opera con un oscilador RC interno dedicado. El
microcontrolador es mantenido en el estado de arranque (Reset) mientras permanece activo
dicho temporizador (PWRT), generando as un retraso que permita alcanzar un nivel de voltaje
de alimentacin VDD aceptable. Este temporizador puede ser habilitado o deshabilitado
mediante el bit de configuracin correspondiente (power-up timer enable bit). Este temporizador
debera habilitarse cuando es habilitado el arranque Brown-out (BOR). Si el bit PWRTE = 0
significa que se encuentra habilitado (esta condicin es para microcontroladores actuales, ya
que en versiones anteriores era el caso invertido, es decir, el bit PWRTE = 0 significaba
deshabilitado). Refirase a las especificaciones tcnicas del modelo empleado para asegurarse
de esta condicin.
El tiempo de retardo generado por este temporizador variar de dispositivo a dispositivo debido
al voltaje de alimentacin VDD, la temperatura y las variaciones del proceso de fabricacin.

25

Temporizador del arranque del oscilador (Oscillator Start-up timer) (OST)


Este temporizador proporciona un retardo equivalente a 1024 ciclos (desde la entrada OSC1)
despus de que el temporizador PWRT ha concluido su conteo, lo que asegura la estabilidad
del oscilador de cristal o resonador. El temporizador OST es invocado nicamente en los
modos XT, LP y HS, utilizndolo solo en el arranque de voltaje de alimentacin al encendido
(Power-on Reset), el arranque Brown-out o al despertar (wake-up) del estado de reposo
(sleep).
Este temporizador cuenta los pulsos del oscilador sobre el pin OSC1/CLKIN y la longitud de su
retardo depender de la frecuencia del cristal o resonador.
La figura 4.4 muestra la operacin del circuito OST en conjunto con el temporizador del voltaje
de alimentacin de encendido (power-up timer). Observe que para cristales de baja frecuencia
el tiempo de retardo del arranque vendr a ser muy grande.

Figura 4.4

Tiempo de arranque del oscilador

Secuencia de encendido (Power-up)


En el encendido del voltaje de alimentacin, la secuencia del retardo se describe a
continuacin: Primeramente el arranque de encendido (POR) es detectado internamente y, si
ste ha sido habilitado, el retardo del temporizador del voltaje de alimentacin al encendido
(PWRT) es activado. Una vez que ha concluido dicho retardo, el temporizador del arranque del
oscilador (OST) inicia su conteo. Aqu podemos ver que el retardo total variar de acuerdo a la
configuracin del oscilador y al estado del bit PWRTE. Por ejemplo, en el modo RC con el bit
PWRTE = 1 (PWRT deshabilitado), no existir ningn retardo. Las figuras 4.5, 4.6 y 4.7 nos
muestran varias secuencias de retardo.
Debido a que los retardos ocurren a partir del pulso interno del POR, si MCLR se mantuviera
bajo un tiempo suficientemente largo, los retardos expiraran. Posteriormente, poniendo MCLR

26

alto iniciara la ejecucin del programa inmediatamente (figura 4.7). Esto es muy til para
propsitos de prueba o para sincronizar ms de un microcontrolador operando en paralelo.
Si el voltaje de alimentacin del microcontrolador no se encontrara dentro de las
especificaciones elctricas al final del retardo, el pin MCLR/VPP deber mantenerse bajo hasta
que ste cumpla con dichas especificaciones. El uso de un retardo generado con un arreglo RC
externo es suficiente en muchas de estas aplicaciones.
La tabla 4.1 muestra los retardos que ocurren en varias situaciones, mientras que la figura 4.5
a 4.8 nos muestran cuatro casos diferentes que pueden ayudar al microcontrolador en el
encendido.

Tabla 4.1

Retardos en varias situaciones

Figura 4.5 Secuencia de retardo en el encendido (Power-up) (MCLR conectado a VDD)

27

Figura 4.6 Secuencia de retardo en el encendido (Power-up) (MCLR no conectado a VDD)


Caso 1

Figura 4.7 Secuencia de retardo en el encendido (Power-up) (MCLR no conectado a VDD)


Caso 2

Figura 4.8 Tiempo de subida del voltaje de alimentacin lento (MCLR conectado a VDD)

28

Arranque tipo Brown-out (BOR)


El circuito correspondiente a este tipo de arranque pone al microcontrolador en la condicin de
arranque (Reset) cuando el voltaje de alimentacin cae por debajo del punto BVDD. Esto
asegura que el microcontrolador no continuar la ejecucin del programa en caso de que el
voltaje de alimentacin se encuentre fuera del rango de operacin. El Arranque tipo Brownout (BOR) es comnmente utilizado en aplicaciones de lnea de corriente alterna (AC) o bien
en aplicaciones usando bateras de gran capacidad, donde grandes cargas pueden ser
conectadas (tales como automotrices) y causar al microcontrolador una cada temporal de
voltaje por debajo de las especificaciones mnimas de operacin. Antes de usar este tipo de
arranque verifique que las especificaciones elctricas del modelo de microcontrolador a utilizar
cumplan con los requerimientos de la aplicacin.
El circuito de arranque tipo Brown-out es controlado mediante el bit de configuracin BODEN,
el cual podr ser deshabilitado (si este es programado como 0) o habilitado (si es programado
como 1). As, si el voltaje VDD cae por debajo del voltaje BVDD (tpicamente 4.0 V), el
microcontrolador ir al estado de arranque (Reset) y permanecer en este estado hasta que el
voltaje VDD nuevamente sobrepase el punto BVDD y el temporizador de encendido (Power-up
Timer) termine su conteo de 72 milisegundos adicionales. Ahora bien, si nuevamente cayera el
voltaje por debajo del voltaje BVDD mientras el temporizador se encuentra operando, el
microcontrolador volver a la condicin de arranque (Reset) y el temporizador reiniciar su
conteo. La figura 4.9 muestra esta situacin.
Con el bit de configuracin BODEN = 1, todos los voltajes por debajo del punto BVDD,
mantendrn al microcontrolador en estado de arranque (Reset).
Figura 4.9

Situaciones del arranque Brown-out

Recuerde que no todos los modelos poseen este tipo de circuito o que el nivel de voltaje BVDD
pudiera ser el no deseado. En estos casos podrn usarse algn circuito externo. Las figuras
4.10 y 4.11 nos muestran dos ejemplos de circuitos externos que pudieran ser implementados.
Obviamente, cada ejemplo deber ser evaluado para ver si cumple con los requerimientos de
la aplicacin.

29

Figura 4.10

Circuito externo Brown-out nmero 1

Figura 4.11

Circuito externo Brown-out nmero 2

Registros y valores de los bits de estado


Las tablas 4.2 y 4.3 nos muestran los valores de los bits de estado cuando alguna de las
diversas condiciones de encendido (Reset) ocurre, as como los registros involucrados y sus
afectaciones.

30

Tabla 4.2

Tabla 4.3

Bits de estado y su significado

Condiciones de inicializacin para registros especiales

31

Tabla 4.4 Condiciones de inicializacin para los registros de funcin especial.

32

Tabla 4.4 Condiciones de inicializacin para los registros de funcin especial.


(Continuacin)

33

Registros de Control de Poder (Power Control) y de Estado (Status)


El registro de control de poder (PCON) contiene un bit de estado que permite la diferenciacin
entre un arranque de alimentacin (Power-on Reset) (POR), un arranque MCLR externo
(external MCLR Reset) o un arranque de guardia (WDT Reset). Este registro de 4 bits, tambin
contiene un bit de estado para determinar si un arranque Brown-out (Brown-out Reset)
ocurri.
El bit BOR (Brown-out Reset) es desconocido en un arranque de encendido (Power-on Reset).
Inicialmente debe ser puesto a 1 por el usuario y revisado sobre subsecuentes arranques
para ver si BOR = 0, lo que indicara que un arranque Brown-out ha ocurrido. El bit de
estado de BOR es uno del tipo no importa (dont care) si el circuito Brown-out es
deshabilitado (mediante el apagado del bit BODEN en la palabra de configuracin
(Configuration word).
El bit POR (Power-on Reset) es apagado al generarse un arranque de alimentacin (Power-on
Reset) y no se afectar en ninguna otra circunstancia. El usuario deber encender este bit
seguido de un arranque de alimentacin (Power-on Reset). Si subsecuentes arranques
ocurrieran y el bit POR resultara ser 0, indicara que un arranque de encendido (Power-on
Reset) habr ocurrido.
El bit PER (Parity Error Reset) se apagar si se presenta la condicin de arranque (Reset)
provocado por la deteccin de un error de paridad. Este bit deber ser encendido por el
programa del usuario. Adicionalmente, este bit es puesto a 1, si la condicin de arranque de
encendido (Power-on Reset) se presenta.
El bit MPEEN (Memory Parity Error Enable) refleja su estado en la palabra de configuracin
(Configuration word). Este bit no es afectado en ninguna otra circunstancia.
Registro PCON

bit7

MPEEN: Bit del estado del circuito de deteccin de error de paridad en memoria.
Este bit refleja el valor del bit de configuracin MPEEN.

bit 6:3 No implementado: Ledo como 0.


bit 2

PER: Bit del estado de la deteccin de error de paridad en memoria de programa.


1 = Ninguna deteccin de error de paridad en memoria ha ocurrido.
0 = Una deteccin de error de paridad en memoria de programa ha ocurrido.
(Debe ser puesto a 1 por el programa despus de su deteccin).

bit 1

POR: Bit del estado de la deteccin de arranque de encendido (Power-on Reset)


1 = Ningn arranque de encendido (Power-on Reset) ha ocurrido.
0 = Una deteccin de arranque de encendido (Power-on Reset) ha ocurrido.
(Debe ser puesto a 1 por el programa despus de su deteccin).

bit 0

BOR: Bit del estado de la deteccin de arranque Brown-out (Brown-out Reset)


1 = Ningn arranque Brown-out (Brown-out Reset) ha ocurrido.
0 = Una deteccin de arranque Brown-out (Brown-out Reset) ha ocurrido.
(Debe ser puesto a 1 por el programa despus de su deteccin).

34

Nota:

R = bit de lectura

W = bit de escritura

U = bit no implementado, ledo como 0

u = bit sin cambio


- n = Valor al arranque POR

El registro STATUS contiene dos bits (TO y PD) los cuales, cuando son usados en conjuncin
con los bits del registro PCON, proporcionan al usuario suficiente informacin para determinar
la causa del arranque (Reset).
Registro STATUS

bit7

IRP: Bit de seleccin del banco de registros (Register Bank Select)


(usado para direccionamiento indirecto)
1 = Banco 2, 3 (100h 1FFh)
0 = Banco 0, 1 (00h FFh)
Para microcontroladores con bancos 0 y 1 nicamente, este bit es reservado y deber
mantenerse en 0.

bit 6:5 RP1:RP0: Bit de seleccin del banco de registros (Register Bank Select)
(usado para direccionamiento directo)
11 = Banco 3 (180h 1FFh)
10 = Banco 2(100h 17Fh)
01 = Banco 1 (80h FFh)
00 = Banco 0 (00h 7Fh)
Cada banco es de 128 bytes. Para microcontroladores con banco 0 y 1 nicamente,
este bit es reservado y deber mantenerse en 0.
bit 4

TO: Bit de tiempo fuera (Time-out bit)


1 = Despus del encendido (Power-up), la instruccin CLRWDT o la instruccin SLEEP.
0 = Un tiempo fuera del temporizador de guardia (WDT) ocurri.

bit 3

PD: Bit de voltaje de alimentacin cado (Power down bit)


1 = Despus del encendido (Power-up) o la instruccin CLRWDT.
0 = Por la ejecucin de la instruccin SLEEP.

bit 2

Z: Bit cero (Zero bit)


1 = El resultado de una operacin aritmtica o lgica fu cero.
0 = El resultado de una operacin aritmtica o lgica NO fu cero.

bit 1

DC: Bit digito acarreado / prstamo (Digit carry / borrow bit)


1 = Un acarreo del cuarto bit menos significante en el resultado ocurri.
0 = Ningn acarreo del cuarto bit menos significante en el resultado ocurri

bit 0

C: Bit acarreo / prstamo (Carry / borrow bit)


(Solo en las instrucciones ADDWF, ADDLW, SUBLW, SUBWF)
1 = Un acarreo del bit ms significante en el resultado ocurri.
0 = Ningn acarreo del bit ms significante en el resultado ocurri.

Nota:

Para prstamo (borrow) la polaridad es invertida. Una resta es ejecutada por sumar el

35

complemento a 2 del segundo operando. Para las instrucciones de rotacin (RRF,


RLF), este bit es cargado con cualquiera de los bits alto (bit 7) o bajo (bit 0) del registro
fuente (source register).
Nota:

R = bit de lectura

W = bit de escritura

U = bit no implementado, ledo como 0

u = bit sin cambio


- n = Valor al arranque POR

36

Arquitectura

El alto desempeo de los microcontroladores PIC puede ser atribuido al nmero de


caractersticas comnmente encontradas en microprocesadores RISC (Reduced Instructuction
Set Complex). Estas incluyen:

Arquitectura tipo HARVARD


Instrucciones de palabra larga (Long word)
Instrucciones de palabra simple (Single word)
Instrucciones de ciclo sencillo (Single cycle)
Yuxtaposicin de la Instruccin (Instruction pipelining)
Conjunto reducido de instrucciones
Arquitectura de registros en fila (Register File Architecture)
Instrucciones ortogonales (simtricas)

La figura 5.2 muestra un arreglo de conductores (bus) de memoria central para los
microcontroladores de la serie 16Cxxx.
Arquitectura HARVARD
Este tipo de arquitectura se caracteriza por tener la memoria de programa (EPROM) y la
memoria de datos (RAM) en forma separada, siendo accedidas desde diferentes buses. Esta
caracterstica mejora el ancho de banda comparado con el tipo de arquitectura tradicional Von
Neumann, el cual contempla la memoria de programa y la memoria de datos sobre el mismo
bus de acceso. Para ejecutar una instruccin en un microprocesador con arquitectura Von
Neumann ste debe hacer uno o ms (generalmente ms) accesos a travs del bus de 8 bits
para buscar la instruccin y posteriormente el dato, operarlo y posiblemente escribirlo. Como
puede verse en esta descripcin, este bus puede estar extremadamente congestionado. A
diferencia de lo anterior, en la arquitectura Harvard la instruccin es buscada en un solo ciclo
de instruccin (single instruction cycle) (los 12 y 14 bits en la serie 12Cxxx y 14 bits en la serie
16Cxxx). As, mientras la instruccin es buscada accediendo la memoria de programa, la
memoria de datos es leda o escrita a travs de otro bus independiente. Estos buses
separados permiten que una instruccin sea ejecutada mientras es buscada la siguiente
instruccin. La figura 5.1 muestra una comparacin entre la arquitectura Harvard y la Von
Neumann.

37

Figura 5.1

Bloques de las arquitecturas Harvard vs. Von Neumann

Instrucciones de palabra larga (Long word)


Las instrucciones de palabra larga poseen un bus de instrucciones ms amplio (ms bits) que
el bus de memoria de datos de 8 bits. Esto es posible debido a que los dos buses se
encuentran separados y por tal motivo el tamao de la instruccin puede ser diferente que los 8
bits de la memoria de datos. Lo anterior permite un uso ms eficiente de la memoria de
programa.
Instrucciones de palabra simple (Single word)
Los cdigos de operacin de las instrucciones de palabra simple son de 12 y 14 bits (para la
serie 12Cxxx) y 14 bits (para la serie 16Cxxx). Un bus de acceso a memoria de programa
puede buscar, en un solo ciclo, la instruccin completa. Esto implica que el tamao de la
memoria de programa sea el tamao del programa (en nmero de instrucciones) ya que todas
las localidades son vlidas.
En la arquitectura Von Neumann, la mayora de las instrucciones son multi-byte. En general, un
microprocesador con 4 Kbytes de memoria de programa equivaldra a 2 Kbytes de
instrucciones. Esta relacin de 2:1 es en general y depende del cdigo de la aplicacin.
Adicionalmente, debido a que cada instruccin puede abarcar mltiples bytes, no existe
ninguna seguridad de que cada localidad contenga una instruccin vlida.
Yuxtaposicin de la Instruccin (Instruction pipelining)
La Yuxtaposicin de la Instruccin es un traslape de una bsqueda de la instruccin con una
ejecucin de otra instruccin, visto en dos etapas. Es decir, la bsqueda de una instruccin
toma un periodo TCY, mientras que la ejecucin toma otro periodo TCY. Sin embargo, debido al
traslape de la bsqueda de la instruccin actual con la ejecucin de la instruccin previa, se
puede decir que ambas acciones suceden en cada periodo TCY.

38

Conjunto reducido de instrucciones


Cuando un conjunto de instrucciones esta bien diseado y es altamente ortogonal (simtrico),
pocas instrucciones son requeridas para todas las tareas necesarias. Con pocas instrucciones,
el conjunto completo podr ser aprendido ms rpidamente.
Arquitectura de registros de fila (Register File Architecture)
La memoria de datos / registros de fila podr ser direccionada en dos posibles modos: directa o
indirectamente. Todos los registros de funcin especial, incluyendo el contador de programa
(Program Counter), se encuentran mapeados en dicha memoria.
Instrucciones ortogonales (simtricas)
Las instrucciones ortogonales permiten la realizacin de cualquier operacin sobre cualquier
registro utilizando cualquier modo de direccionamiento. Esta naturaleza simtrica y la ausencia
de instrucciones especiales hacen la programacin ms simple y todava eficiente.
Adicionalmente, la curva de su aprendizaje se reduce significativamente.
El conjunto de instrucciones de los microcontroladores PIC utiliza nicamente dos instrucciones
que no son orientadas a registros. Una de ellas es la instruccin SLEEP, la cual pone al
microcontrolador dentro de un modo de ms bajo consumo de corriente. La otra es la
instruccin CLRWDT, la cual verifica que el microcontrolador opere correctamente mediante el
uso del temporizador de guardia (Watchdog Timer) (WDT).

39

Figura 5.2

Diagrma a bloques general de la serie PIC16Cxxx

40

Esquema del reloj / Ciclo de instruccin


La entrada del reloj (de OSC1) es internamente dividida por cuatro, para generar cuatro pulsos
de reloj en cuadratura, denominados Q1, Q2, Q3 y Q4. Internamente, el contador del programa
(program counter) (PC) es incrementado cada Q1, y la instruccin es buscada en la memoria
de programa y atrapada en el registro de instruccin en Q4. La instruccin es decodificada y
ejecutada durante el siguiente ciclo Q1 a Q4. Lo anterior es ilustrado mediante la figura 5.3 y el
ejemplo 4.1.
Figura 5.3

Ciclo de reloj de instruccin

Flujo de la instruccin
Un ciclo de instruccin consiste de cuatro periodos Q (Q1, Q2, Q3 y Q4). La bsqueda de
instruccin toma un ciclo mientras que la decodificacin y ejecucin de instruccin toma otro.
Sin embargo, debido a la yuxtaposicin, cada instruccin se ejecuta en un solo ciclo. Si una
instruccin causara un cambio en el contador de programa (PC) (como por ejemplo: GOTO),
entonces se requerir de un ciclo extra para completar la instruccin (Ejemplo 5.1).
La bsqueda de instruccin comienza con el incremento del contador de programa (PC) en Q1.
En el ciclo de ejecucin, la instruccin buscada es capturada en el registro de instruccin
(Instruction Register) (IR) en el ciclo Q1. Esta instruccin es entonces decodificada y ejecutada
durante los periodos Q2, Q3 y Q4. La memoria de datos es leda durante Q2 (lectura del
operando) y escrita durante Q4 (destino de la escritura).
El ejemplo 5.1 muestra la operacin de las dos etapas de yuxtaposicin para la secuencia de
instruccin mostrada. En el tiempo TCY0, la primera instruccin es buscada en la memoria de
programa. Durante TCY1, la primera instruccin es ejecutada mientras que la segunda
instruccin es buscada. Durante TCY2, la segunda instruccin es ejecutada mientras que la
tercera instruccin es buscada. Durante TCY3, la cuarta instruccin es buscada mientras que la
tercera instruccin (CALL SUB_1) es ejecutada. Cuando la tercera instruccin completa su
ejecucin, el CPU salva la direccin de la instruccin cuatro sobre la pila (stack) y cambia el
contador de programa (PC) a la direccin de SUB_1. Esto significa que la instruccin que fu
buscada durante TCY3 necesita ser descartada de la secuencia. Durante TCY4, la instruccin
cuatro es eliminada (ejecutada como una instruccin NOP) y la instruccin de la direccin

41

SUB_1 es buscada. Finalmente durante TCY5, la instruccin cinco es ejecutada y la instruccin


de la direccin SUB_1 + 1 es buscada.
Ejemplo 5.1

Flujo de la yuxtaposicin de instrucciones

Descripcin de los puertos de entrada/salida (I/O ports)


La tabla 5.1 nos da una breve descripcin de las diferentes funciones que pueden ser
multiplexadas (multiplexed) a un pin de un puerto. Cabe mencionar que podrn existir
mltiples funciones sobre un solo pin. Cuando el multiplexaje(multiplexing) ocurre, los
requerimientos funcionales de los mdulos perifricos podrn forzar la direccin del dato (bit
TRIS) de un puerto, tal como sucede en el mdulo de conversin anlogo/digital (A/D) y en el
mdulo LCD.

42

Tabla 5.1

Descripcin de puertos de entrada/salida (I/O)

43

Tabla 5.1 Descripcin de puertos de entrada/salida (I/O)

44

(Continuacin)

Tabla 5.1

Descripcin de puertos de entrada/salida (I/O)

45

(Continuacin)

Tabla 5.1 Descripcin de puertos de entrada/salida (I/O)

46

(Continuacin)

Tabla 5.1 Descripcin de puertos de entrada/salida (I/O)

47

(Continuacin)

48

CPU y ALU

La unidad central de procesamiento (Central Processing Unit) (CPU) es la responsable de


utilizar la informacin contenida en la memoria de programa (instrucciones) para controlar la
operacin del microcontrolador. Muchas de estas instrucciones operan sobre la memoria de
datos. Para operar sobre la memoria de datos, la unidad lgica y aritmtica (Arithmetic Logical
Unit) (ALU) es requerida. Adicionalmente a la ejecucin de operaciones lgicas y aritmticas,
esta unidad controla los bits de estado (STATUS bits) (los cuales se encuentran en el registro
STATUS). El resultado de algunas instrucciones forzan los bits de STATUS a un valor
dependiendo del estado del resultado.
Los cdigos de mquina que el CPU reconoce, son mostrados en la tabla 6.1, (as como los
mnemnicos de las instrucciones utilizados por el programa ensamblador (Assembler) MPASM
para generar dichos cdigos).

49

Tabla 6.1 Conjunto de instrucciones de los microcontroladores de la serie PIC16Cxxx.

50

Formato general para las instrucciones


Las instrucciones del microcontrolador PIC pueden ser divididas en cuatro formatos, segn se
muestra en la figura 6.1. Como podr observarse, el cdigo de operacin (opcode) para la
instruccin vara de 3 a 6 bits. Este tamao del cdigo de operacin variable es lo que permite
que puedan ser implementadas 35 instrucciones.
Figura 6.1

Formato general para las instrucciones

Unidad Central de Procesamiento (CPU)


La Unidad Central de Procesamiento (CPU) puede ser pensada como el cerebro del
microcontrolador. Esta unidad es responsable por buscar la correcta instruccin para su
ejecucin, decodificarla y ejecutarla.
El CPU algunas veces trabaja en conjuncin con la unidad lgica y aritmtica (ALU) para
completar la ejecucin de la instruccin (en operaciones lgicas y aritmticas).
El CPU controla el bus de direcciones de la memoria de programa, el bus de direcciones de
la memoria de datos y el acceso a la pila (stack).
Reloj de la instruccin (Instruction Clock)
Cada ciclo de instruccin (TCY) esta compuesto de cuatro periodos Q (Q1 a Q4). El tiempo del
periodo Q es el mismo que el tiempo de periodo del oscilador del microcontrolador (TOSC). Los
ciclos Q proveen los tiempos para la decodificacin, lectura, procesamiento del dato, escritura,
etc. de cada ciclo de instruccin. El siguiente diagrma muestra la relacin de los ciclos Q con
el ciclo de instruccin.
Los cuatro ciclos Q que forman un ciclo de instruccin (TCY), podrn generalizarse como:

51

Q1:
Q2:
Q3:
Q4:

Ciclo de decodificacin de la instruccin o forzado a la instruccin NOP.


Ciclo de lectura del dato de la instruccin o la instruccin NOP.
Procesamiento del dato.
Ciclo de escritura del dato de la instruccin o la instruccin NOP.

Cada instruccin mostrar un detallado ciclo de operacin para esa instruccin.


Figura 6.2

Actividad del ciclo Q

Unidad Lgica y Aritmtica (Arithmetic Logical Unit) (ALU)


Los microcontroladores PIC contienen una ALU de 8 bits as como un registro de trabajo W
(Working Register) tambin de 8 bits. Esta unidad es una ALU de propsito general y ejecuta
las funciones aritmticas y lgicas (Boolean) entre el dato en el registro de trabajo y cualquier
otro registro de fila (file register).
Figura 6.3

Operacin de la ALU y el registro de trabajo W

52

La ALU es de 8 bits y es capz de realizar las funciones de: suma (addition), resta
(substraction), corrimiento (shift) y operaciones lgicas. A menos que otra cosa sea
mencionada, las operaciones aritmticas sern realizadas en complemento a 2 (twos
complement). En instrucciones de dos operandos, tpicamente un operando es el registro de
trabajo W (W register), y el otro operando ser un registro de fila o una constante inmediata. En
instrucciones de un solo operando, ste ser el registro de trabajo W o un registro de fila.
El registro de trabajo W es un registro de 8 bits utilizado por las operaciones lgicas y
aritmticas. Este es un registro no direccionable.
Dependiendo de la instruccin ejecutada, la ALU podr afectar los valores de los bits Carry (C),
Digit Carry (DC) y Zero (Z) en el registro STATUS. Los bits C y DC operan como un pedir
prestado (borrow) en la instruccin de substraccin (ver las instrucciones SUBLW y SUBWF
para ejemplos).
Registro STATUS (STATUS Register)
El registro STATUS mostrado en la figura 6.1, contiene el estado aritmtico de la ALU, el
estado del arranque (Reset) y los bits de seleccin de bancos de la memoria de datos. Debido
a que la seleccin de los bancos de la memoria de datos es controlable por este registro, ste
deber estar siempre presente en cada uno de los bancos, as como su posicin (offset)
relativa. (Ver la figura 7.5 Mapa de los registros de fila en el siguiente captulo).
El registro STATUS podr ser el destino para cualquier instruccin como con cualquier otro
registro, es decir, si el registro STATUS fuese el destino para una instruccin que afecte los bits
Z, DC y C, entonces la escritura a estos tres bits ser deshabilitada. Estos bits son prendidos y
apagados de acuerdo a la lgica del dispositivo. Asimismo, los bits TO y PD no son de
escritura. Por lo anterior, el resultado de una instruccin con el registro STATUS como destino
podra resultar diferente a lo intentado.
Por ejemplo, la instruccin CLRF STATUS borrar (0) los tres bits ms significantes y
prender el bit Z. Esto dejar el registro STATUS como: 000uu1uu (donde u significa sin
cambio).
Por lo tanto es recomendado que nicamente sean usadas las instrucciones BCF, BSF,
SWAPF y MOVWF para alterar el registro STATUS ya que estas instrucciones no afectan los
bits Z, C y DC. (Ver tabla 6.1).
Nota 1:

Algunos modelos de microcontroladores PIC no requieren los bits IRP y RP1


(STATUS<7:6>). Estos bits no son usados por el captulo 6 CPU y ALU y
debern ser mantenidos bajos. El uso de estos bits de lectura/escritura (R/W)
como de propsito general NO es recomendado debido a que podran afectar
la compatibilidad con productos futuros.

Nota 2:

Los bits C y DC operarn como bits borrow y digit borrow respectivamente


en las instrucciones de substraccin.

Registro STATUS

53

bit7

IRP: Bit de seleccin de banco de registros (usado en direccionamiento indirecto)


1 = Bank 2, 3 (100h 1FFh)
0 = Bank 0, 1 (00h FFh)
Para modelos con nicamente Bank0 y Bank1, el bit IRP es reservado y siempre
deber ser mantenido apagado 0.

bit 6:5 RP1:RP0: Bits de seleccin de banco de registros (usado en direccionamiento directo)
11 = Bank 3 (180h 1FFh)
10 = Bank 2 (100h 17Fh)
01 = Bank 1 (80h FFh)
00 = Bank 0, 1 (00h 7Fh)
Cada banco es de 128 bytes.
bit 4

TO: Bit de tiempo fuera (Time-out bit)


1 = Despus del encendido (power-up), la instruccin CLRWDT o la instruccin SLEEP.
0 = Un tiempo fuera provocado por WDT (Watchdog Timer) ocurri.

bit 3

PD: Bit de baja de voltaje de alimentacin (Power-down bit)


1 = Despus del encendido (power-up), la instruccin CLRWDT.
0 = Por la ejecucin de una instruccin SLEEP.

bit 2

Z: Bit Zero
1 = El resultado de una operacin lgica o aritmtica fu cero.
0 = El resultado de una operacin lgica o aritmtica NO fu cero.

bit 1

DC: Bit Digit carry/borrow (instrucciones ADDWF, ADDLW, SUBLW, SUBWF)


(Para borrow la polaridad es invertida).
1 = Un acarreo del cuarto bit menos significante del resultado ocurri.
0 = Ningn acarreo del cuarto bit menos significante del resultado ocurri.

bit 0

C: Bit Carry/borrow (instrucciones ADDWF, ADDLW, SUBLW, SUBWF)


1 = Un acarreo del bit ms significante del resultado ocurri.
0 = Ningn acarreo del bit ms significante del resultado ocurri.

Nota:

Para la accin de pedir prestado (borrow) la polaridad es invertida. Una resta


(substraction) es ejecutada por agregar el complemento a dos del segundo operando.
Para las instrucciones de rotacin (rotate) RRF y RLF, este bit es cargado con el bit
ms significante o el bit menos significante del registro fuente.
R = Bit de lectura
W = Bit de escritura
U = Bit no implementado, ledo como 0
- n = Valor al arranque del encendido (Power-on Reset) (POR).

Registro OPTION_REG (OPTION_REG register)


El Registro OPTION_REG es un registro de lectura y escritura el cual contiene varios bits de
control para configurar el pre-escalador del los temporizadores TMR0/WDT (TMR0/WDT
prescaler), la interrupcin externa INT, TMR0 y las resistencias de pull-up en el puerto B
(PORTB).

54

Registro OPTION_REG

bit 7

RBPU: Bit de habilitacin de las resistencias de pull-up


1 = Deshabilitar las resistencias de pull-up del puerto B.
0 = Habilitar las resistencias de pull-up del puerto B.

bit 6

INTEDG: Bit de seleccin del flanco de la interrupcin (Interrupt edge)


1 = Interrupcin en el flanco de subida (rising edge) del pin INT.
0 = Interrupcin en el flanco de bajada (falling edge) del pin INT.

bit 5

T0CS: Bit de seleccin de la fuente del reloj para el temporizador TMR0


1 = Transicin sobre el pin T0CKI.
0 = Reloj interno del ciclo de instruccin (CLKOUT).

bit 4

T0SE: Bit de seleccin del flanco de la fuente del reloj del temporizador TMR0
1 = Incremento en la transicin alto a bajo sobre el pin T0CKI.
0 = Incremento en la transicin bajo a alto sobre el pin T0CKI.

bit 3

PSA: Bit de asignacin del pre-escalador (prescaler assignment)


1 = El pre-escalador es asignado al temporizador de guardia (WDT).
0 = El pre-escalador es asignado al temporizador del mdulo Timer0.

bit 2:0 PS2:PS0: Bits de seleccin de velocidad (Rate) del pre-escalador

Nota:

Para lograr una asignacin de 1:1 para el pre-escalador del temporizador TMR0, asigne
el pre-escalador al temporizador de guardia WDT.
R = Bit de lectura
W = Bit de escritura
U = Bit no implementado, ledo como 0
- n = Valor al arranque del encendido (Power-on Reset) (POR).

Registro PCON (PCON Register)


El registro de control de encendido (Power Control register) (PCON) contiene los bits de las
banderas (flag bits), que junto con los bits TO y PD, permitirn al usuario diferenciar entre los
diversos tipos de arranque (Resets) del microcontrolador.
Nota 1:

El bit BOR es desconocido en el arranque de encendido (Power-on Reset), por


lo que deber ser encendido por el usuario y revisado en subsecuentes

55

arranques (resets) para ver si el bit BOR ha sido apagado. Si este fuese el
caso, esto indicar que un arranque del tipo Brown-out ha ocurrido.
El bit BOR es uno del tipo no importa (dont care) en caso que ste se
encuentre deshabilitado (mediante el apagado del bit BODEN en la palabra de
configuracin (configuration word)).
Nota 2

Se recomienda que el bit POR sea apagado despus de que un arranque de


encendido (Power-on Reset) haya sido detectado, de manera tal que otros
arranques de encendido (Power-on Reset) subsecuentes puedan ser
detectados.

Registro PCON

bit 7

MPEEN: Bit del estado del circuito de error de paridad en memoria


(Memory Parity Error Circuitry Status bit).
Este bit refleja el valor del bit de configuracin MPEEN.

bit 6:3 No implementados, ledos como 0.


bit 2

PER: Bit del estado de arranque (reset) del error de paridad en memoria
(Memory Parity Error Reset Status bit).
1 = Ningn error ocurri.
0 = Un error de paridad en la memoria de programa ocurri.
(Debe ser prendido en el programa despus de que un arranque de
encendido (Power-on Reset) ocurre).

bit 1

POR: Bit del estado de arranque de encendido (Power-on Reset Status)


1 = Ningn arranque de encendido (Power-on Reset) ha ocurrido.
0 = Un arranque de encendido (Power-on Reset) ha ocurrido
(Debe ser prendido en el programa despus de que un arranque de
encendido (Power-on Reset) ocurre).

bit 0

BOR: Bit del estado de arranque Brown-out (Brown-out Reset Status)


1 = Ningn arranque Brown-out (Brown-out Reset) ha ocurrido.
0 = Un arranque Brown-out (Brown-out Reset) ha ocurrido
(Debe ser prendido en el programa despus de que un arranque
Brown-out (Brown-out Reset) ocurre).
R = Bit de lectura
W = Bit de escritura
U = Bit no implementado, ledo como 0
- n = Valor al arranque del encendido (Power-on Reset) (POR).

56

Organizacin de Memoria

En cada microcontrolador PIC existen dos bloques de memoria: la memoria de programa y la


memoria de datos. Cada bloque posee su propio bus de acceso por lo que ambos bloques
pueden ser accedidos durante el mismo ciclo del oscilador.
La memoria de datos puede ser dividida en dos secciones: los registros de funcin especial
(SFR) y la memoria de propsito general (RAM). En este captulo se describir la operacin de
los registros de funcin especial (SFR) que controlan la parte central (core) del
microcontrolador, mientras que los registros usados por los mdulos perifricos sern tratados
en su captulo correspondiente.
Organizacin de la memoria de programa
Los microcontroladores PIC de la serie 16Cxxx tienen un contador de programa (Program
Counter) (PC) de 13 bits capz de direccionar un espacio de memoria de programa de 8K x 14
como mximo (ver especificaciones tcnicas de cada modelo). El ancho del bus de la
memoria de programa (palabra de instruccin) es de 14 bits. Debido a que todas las
instrucciones son de una sola palabra (single word), los microcontroladores con capacidad de,
por ejemplo, 8K x 14 de memoria de programa tendrn el mismo nmero (8K) de instrucciones,
lo que har mucho ms sencillo determinar si se cuenta con la memoria suficiente para una
cierta aplicacin.
El espacio de la memoria de programa es dividida en cuatro pginas de 2K palabras cada una
(0h 7FFh, 800h FFFh, 1000h 17FFh y 1800h 1FFFh). La figura 7.1 muestra el mapa de
memoria de programa as como los 8 diferentes niveles de profundidad del circuito de pila
(stack). Ahora bien, dependiendo del modelo, slo ser implementada la porcin de memoria
que ste posea (refirase a las especificaciones tcnicas del modelo en cuestin).
Para brincar entre las pginas de la memoria de programa, los bits ms significantes del
contador de programa (PC) debern ser modificados. Esto se hace escribiendo el valor
deseado dentro del registro de funcin especial PCLATH (Program Counter Latch High). Si
fuesen ejecutadas instrucciones secuenciales, el contador de programa cruzar las pginas sin
ninguna intervencin del usuario. Ahora bien, para microcontroladores que poseen menos de
8K palabras, el acceso a una localidad prxima superior a su direccin fsicamente
implementada causar un reciclado (wraparound). Por ejemplo, en un modelo con 4K palabras
de memoria de programa, accediendo la direccin 17FFh, esta acceder a la direccin 7FFh.
Los modelos con 2K palabras o menores no requerirn de paginado.

57

Figura 7.1

Arquitectura del mapa de memoria de programa y pila (stack)

Vector de arranque (Reset Vector)


En cualquier microcontrolador PIC, un arranque (Reset) hace que el contador de programa
(PC) apunte hacia la direccin 0000h. Esta direccin es llamada la direccin del Vector de
Reset ya que esta ser la direccin a la que el programa saltar cuando ocurra un arranque
(Reset) en el microcontrolador.
Cualquier arranque (Reset) tambin borrar el contenido del registro PCLATH, lo que significa
que cualquier salto al Vector de Reset (0000h) brincar la primera localidad de memoria de
programa de la pgina 0.

58

Vector de Interrupcin
Cuando una interrupcin sea reconocida, el contador de programa (PC) ser forzado a la
direccin 0004h. Esta es llamada la direccin del Vector de Interrupcin. En este caso, el
registro PCLATH no es modificado, por lo que una vez que se encuentre en la rutina de
atencin a interrupcin (interrupt service routine) (ISR), se podr escribir en el registro PCLATH
si fuese necesario, pero salvando previamente el valor de dicho registro para ser reintegrado a
su valor antes de abandonar dicha rutina.
Informacin de calibracin
Algunos modelos poseen informacin de calibracin almacenada en la memoria de programa.
Esta informacin es programada por el fabricante Microchip cuando el dispositivo se encuentra
en la prueba final. El uso de este valor permite a la aplicacin lograr mejores resultados. La
informacin de calibracin se encuentra generalmente al final de la memoria de programa y es
implementada como una instruccin RETLW siendo el valor literal, la informacin de
calibracin.
Nota:

Para las versiones de ventana, lea y copie el valor de calibracin antes de borrar el
dispositivo. Esto permitir reintegrar dicho valor nuevamente al ser reprogramado.
Escribir este valor sobre el empaque es altamente recomendado.

Contador de programa (Program Counter) (PC)


El contador de programa (PC) especifica la direccin de la instruccin a buscar para su
ejecucin y es de 13 bits de tamao. El byte menos significante (low byte) es llamado el
registro PCL. Este registro es de lectura y escritura. El byte ms significante (high byte) es
llamado el registro PCH. Este registro contiene los bits PC<12:8> y no puede ser ledo ni
escrito directamente. Es decir, todas las modificaciones a dicho registro se debern hacer a
travs del registro PCLATH.
La figura 7.2 muestra las cuatro diferentes situaciones para el cargado del contador de
programa (PC). La situacin 1 muestra como el PC es cargado con la escritura al registro PCL
(PCLATH<4:0>
PCH). La situacin 2 muestra como el PC es cargado durante la instruccin
GOTO (PCLATH<4:3>
PCH). La situacin 3 muestra como el PC es cargado durante la
instruccin CALL (PCLATH<4:3>
PCH), con el PC cargado (empujado (PUSHed)) sobre la
parte alta de la pila (stack). La situacin 4 muestra como el PC es cargado durante una de las
instrucciones de regreso (RETURN) donde el PC es cargado (jalado (POPed)) de la parte alta
de la pila (stack).

59

Figura 7.2

Cargado del PC en diferentes situaciones

60

GOTO computado
Un GOTO computado es obtenido mediante la suma de un valor de desbalance (offset) al
contador de programa (PC) (es decir, la instruccin ADDWF PCL).
Cuando hacemos una lectura a una tabla mediante el mtodo del uso de un GOTO computado,
ste deber ser ejercitado cuidadosamente si la localidad de la tabla cruza los lmites del
bloque de memoria, o sea, del registro PCL (cada bloque es de 256 bytes).
Nota:

Cualquier escritura al registro PCL causar que los 5 bits menos significantes del
registro PCLATH sean cargados dentro del registro PCH.

Pila (Stack)
La pila (stack) permite la ocurrencia de una combinacin de hasta 8 llamadas como mximo a
rutinas (CALL) e interrupciones. La pila (stack) contiene la direccin de regreso de la
ramificacin (branch) en la ejecucin del programa.
Los microcontroladores de la serie 16Cxxx tienen una pila (stack) de 8 niveles de 13 bits cada
uno. Este espacio no es parte de ninguna de las memorias de programa ni de datos y su
apuntador (stack pointer) no puede ser ledo ni escrito.
As, cuando una ramificacin en el programa vaya a ser ejecutada, ya sea generada por una
instruccin CALL (salto a una rutina) o por alguna interrupcin (salto al vector de interrupcin),
antes de realizar este salto, la direccin que apunta el PC + 1 (siguiente instruccin a ejecutar
despus del regreso) ser salvada en la pila (stack). Posteriormente a esto, la rutina invocada
ser ejecutada, finalizando siempre con una instruccin de regreso (RETURN, RETLW o
RETFIE), la cual provocar que el valor localizado en la parte alta de lapila (stack) sea
reintegrado al contador del programa (PC), provocando la continuacin del programa donde fu
interrumpido. Cabe aclarar que el registro PCLATH no es modificado cuando la pila (stack) es
jalado (POPed) o empujado (PUSHed).
Despus de que la pila (stack) ha sido cargada o empujada (PUSHed) 8 veces, la novena vez
se sobrescribir en el valor que fu cargada la primera vez. La dcima vez se sobrescribir en
el valor que fu cargada la segunda vez, y as sucesivamente. La figura 7.3 muestra un
ejemplo de la sobrescritura de la pila (stack).

Figura 7.3

Modificacin de la pila (stack)

61

Nota 1: No existen bits de estado que indiquen un sobreflujo (overflow or


underflow) de la pila (stack).
Nota 2: No existe ninguna instruccin o mnemnico llamada PUSH o POP.
Estas son solo acciones que ocurren de la ejecucin de las
Instrucciones CALL, RETURN, RETLW y RETFIE o de la atencin
a una interrupcin.
Paginacin de la memoria de programa (Program Memory Paging)
Algunos modelos de microcontroladores PIC poseen una memoria de programa cuyo tamao
exceden 2K palabras, pero las instrucciones CALL y GOTO solo tienen un rango de
direccionamiento de 11 bits. Este rango nos permite saltos dentro de una pgina de memoria
de programa de 2K. Para permitir a las instrucciones CALL y GOTO direccionar el rango
completo de 8K debern existir otros dos bits adicionales que indiquen la pgina. Estos bits de
paginacin se encuentran contenidos en el registro PCLATH<4:3> (figura 7.2).
Cuando se utilicen las instrucciones CALL y GOTO, el usuario deber asegurarse que estos
bits (PCLATH<4:3>) sean debidamente programados. Observe que cuando alguna de las
instrucciones de retorno sea ejecutada, los 13 bits del PC sern jalados (POPed) de la pila
(stack). Por consiguiente, la manipulacin de los bits PCLATH<4:3> no es requerida para las
instrucciones de regreso.
Nota:

Los modelos con memoria de programa de 2K o menores, ignorarn los


bits de paginacin (PCLATH<4:3>), los cuales sern utilizados nicamente para
acceder a la memoria de programa con ms de una pgina disponible. No es
recomendado usar los bits de paginacin (PCLATH<4:3>) como bits de propsito
general ya que pudieran afectar la compatibilidad con productos futuros.
Asimismo, los modelos con memoria de programa entre 2K y 4K palabras, ignorarn el
bit de paginacin PCLATH<4>, el cual es utilizado para acceder las pginas 2 y 3
(1000h 1FFFh).

El ejemplo 7.1 muestra el llamado de una subrutina en la pgina 1 de la memoria de programa.


Este ejemplo asume que el registro PCLATH es salvado y recuperado por la rutina de servicio
de interrupcin (si las interrupciones fueran utilizadas).
Ejemplo 7.1 Llamada de una subrutina en la pgina 1 desde la pgina 0

62

Organizacin de la memoria de datos


La memoria de datos esta integrada por el rea de los registros de funcin especial (SFR) y el
rea de los registros de propsito general (GPR). Los registros de funcin especial (SFR)
controlan la operacin del microcontrolador mientras que los registros de propsito general
(GPR) son usados para almacenar datos en general.
La memoria de datos es dividida en bancos, tanto para los registros de funcin especial (SFR)
como para los registros de propsito general (GPR). El rea de estos ltimos registros (GPR)
permite tener ms de 96 bytes de memoria RAM de propsito general. Los registros de funcin
especial (SFR) son los que controlan los perifricos como las funciones centrales del
procesador. Para la seleccin de los bancos se requiere del uso de tres bits de control, los
cuales se encuentran localizados en el registro STATUS (STATUS<7:5>). La figura 7.5 muestra
uno de los mapas de la organizacin de la memoria de datos, la cual depende del modelo del
microcontrolador.
Para mover el valor de un registro a otro, deber hacerse a travs del registro de trabajo W, lo
que significa que esta accin requiere de dos ciclos de instruccin. Toda la memoria de datos
puede ser direccionada, ya sea directa o indirectamente. Para el direccionamiento directo se
puede requerir del uso de los bits RP1:RP0, mientras que para el direccionamiento indirecto se
requerir del registro de seleccin de fila (File Select Register) (FSR). Asimismo, el
direccionamiento indirecto utiliza el bit del apuntador del registro indirecto (Indirect Register
Pointer) (IRP) del registro STATUS para acceder dentro de las reas del Banco0 / Banco1 o del
Banco2 / Banco3 de la memoria de datos.
Registros de propsito general (General Purpose Registers) (GPR)
Algunos modelos de microcontroladores PIC tienen dentro de la memoria de datos, dividida el
rea de registros de propsito general (GPR) en bancos, los cuales no son inicializados en el
arranque de encendido (Power-on Reset) y permanecen sin cambio en todos los tipos de
arranque (Resets) restantes.
Los registros de fila (Register File) pueden ser accedidos directamente o mediante el registro
de seleccin de fila (File Select Register) (FSR) indirectamente. Algunos modelos tienen reas
compartidas a travs de los bancos de memoria de datos de manera tal que una lectura o
escritura a esa rea aparecer como la misma localidad (es decir, su valor)
independientemente del banco. Nos referiremos a esta rea como memoria de datos (RAM)
comn (Common RAM).
Registros de Funcin Especial (Special Function Register) (SFR)
Los registros de funcin especial (SFR) son usados por el CPU y por los mdulos perifricos
para controlar la operacin deseada del microcontrolador y son implementados como memoria
esttica (Static RAM).
Estos registros pueden ser clasificados en dos conjuntos: unos asociados a las funciones
centrales y otros asociados a las funciones perifricas. Los primeros son descritos en este
captulo mientras que los segundos sern descritos en el captulo de la funcin perifrica
correspondiente.
Todos los modelos de microcontroladores de la serie 12Cxxx y 16Cxxx tienen bancos de
memoria en el rea de SFR. Para conmutar entre estos bancos debern usarse los bits RP0 y
RP1 en el registro STATUS para configurar el banco deseado. Algunos registros SFR son

63

inicializados por el arranque de encendido (Power-on Reset) y otros tipos de arranque (Resets)
mientras que otros ms no son afectados.
Nota: El rea de registros de funcin especial (SFR) puede tener registros de propsito
general (GPR) mapeados en estas localidades.
Los registros de fila pueden ser accedidos directamente o usando el registro de seleccin de
fila (FSR) indirectamente.
Uso de bancos (Banking)
La memoria de datos esta dividida en cuatro bancos. Cada uno de estos bancos contienen
registros de propsito general y registros de funcin especial. La conmutacin entre estos
bancos requiere de los bits RP0 y RP1 en el registro STATUS para configurar el banco
deseado, cuando es utilizado el direccionamiento directo. El bit IRP en el registro STATUS es
utilizado para el direccionamiento indirecto.
Tabla 7.1

Direccionamiento de bancos

Cada banco se extiende hasta 128 bytes (7Fh). Las localidades bajas de cada banco son
reservadas para los registros de funcin especial (SFR). Arriba de estos registros se
encuentran los registros de propsito general (GPR). Toda la memoria de datos es
implementada con memoria RAM esttica (Static RAM). Todos los bancos pueden contener
registros de funcin especial (SFR). Algunos de estos registros que son muy utilizados
aparecen contenidos en todos los bancos, con el objeto de reducir el cdigo de instrucciones y
tener un acceso ms rpido.
A travs de la evolucin de los productos, existen algunas pequeas variaciones en la
distribucin (layout) de la memoria de datos. El estndar de los nuevos productos se muestra
en la figura 7.5. Este mapa de memoria tiene los ltimos 16 bytes mapeados en todos los
bancos de memoria con el objeto de reducir la conmutacin entre bancos a travs del
programa (software). Los registros en negritas estarn en cada modelo. Los otros registros
sern dependientes de los perifricos que contenga el microcontrolador. En la figura no son
mostrados cada uno de los registros de perifricos debido a que algunos registros de fila tienen
diferentes registros a los mostrados. Como con todas las tablas, figuras y especificaciones
presentadas en este libro de referencia, por favor verifique las especificaciones tcnicas
(Datasheet) del modelo de microcontrolador a utilizar.

64

Figura 7.4

Direccionamiento Directo (Direct Addressing)

65

Figura 7.5

Mapa de Registros de Fila (Register File)

El mapa en la figura 7.6 muestra el mapa de algunos modelos de microcontroladores de 18


pines. Recuerde que los registros no implementados se leern como 0.

66

Figura 7.6

Mapa de los Registros de Fila

Direccionamiento Indirecto (Indirect Addressing), Registros INDF y FSR


El direccionamiento indirecto es un modo en el que la direccin del dato en la instruccin no es
fija. Un registro de funcin especial (FSR) es usado como apuntador a la localidad de la
memoria de datos a leer o escribir. Debido a que este apuntador se encuentra en la memoria
de datos (RAM), el contenido de ste puede ser modificado por programa. Esto puede ser til
para el manejo de tablas de datos. La figura 7.7 muestra la operacin del direccionamiento
indirecto. En sta se muestra el movimiento del valor de la direccin especificada por el valor
del registro FSR.
El direccionamiento indirecto es posible gracias al registro INDF. Cualquier instruccin que use
el registro INDF, direcciona el registro que apunte el registro FSR. Si este ltimo registro es
ledo con direccionamiento indirecto (FSR=0), el valor de ste ser de 00h. La escritura
indirecta a este registro resultar en una instruccin NOP (No Operation) aunque algunos bits
del registro STATUS puedan ser afectados. Una direccin efectiva de 9 bits es generada con la
concatenacin del bit IRP (STATUS<7>) con los 8 bits del registro FSR, segn se muestra en
la figura 7.8.

67

Figura 7.7

Direccionamiento Indirecto

Figura 7.8

Direccionamiento Indirecto

El ejemplo 7.2 muestra el uso del direccionamiento indirecto en donde son borradas las
localidades de la memoria RAM (20h 2Fh) con un mnimo de instrucciones. Un concepto

68

similar podra ser usado para mover un nmero indefinido de bytes (bloque de datos) al
registro de transmisin (TXREG) del USART. La direccin de inicio del bloque de datos a ser
transmitidos podra ser fcilmente modificada por el programa.
Ejemplo 7.2

Direccionamiento Indirecto

Inicializacin
El ejemplo 7.3 muestra como la conmutacin de bancos ocurre en el direccionamiento directo,
mientras que el ejemplo 7.4 muestra el cdigo para borrar (inicializar) los registros de propsito
general en RAM.
Ejemplo 7.3

Conmutacin de bancos

69

Ejemplo 7.4

Inicializacin de RAM

70

EEPROM

La memoria de datos EEPROM es de lectura y escritura durante su operacin normal (rango


completo de VDD). Esta memoria no es directamente mapeada en el espacio de los registros de
fila sino que es direccionada indirectamente a travs de los registros de funcin especial (SFR).
Existen cuatro registros SFR utilizados para leer y escribir en esta memoria. Estos registros
son:
EECON1
EECON2 (registro no fsicamente implementado)
EEDATA
EEADR
El registro EEDATA contiene los 8 bits del dato a leer o escribir, mientras que el registro
EEADR contiene la direccin de la localidad EEPROM siendo accedida. Este registro de 8 bits
puede acceder hasta 256 localidades de datos en EEPROM. El registro EEADR puede ser
pensado como el registro de direccionamiento indirecto de los datos EEPROM. El registro
EECON1 contiene los bits de control, mientras que el registro EECON2 es el registro usado
para inicializar la lectura y escritura.
Algunos modelos implementan menos localidades de memoria que otros. El rango de
direcciones siempre comienza con 0h y va hasta la memoria disponible. La tabla 8.1 muestra
algunos posibles tamaos de memoria y el rango de direcciones de esos tamaos.
Tabla 8.1 Posibles tamaos de la memoria de datos EEPROM

La memoria de datos EEPROM permite la lectura y escritura de bytes. La escritura de un byte


automticamente borra la localidad y escribe el nuevo dato (borra antes de escribir). La
memoria de datos EEPROM tiene una alta relacin de ciclos de borrado/escritura. El tiempo de
escritura es controlado por un temporizador integrado. El tiempo de escritura variar con el
voltaje de alimentacin y la temperatura, as como de circuito integrado a circuito integrado. Por
favor, refirase a las especificaciones tcnicas de AC para los lmites exactos.
Cuando el microcontrolador es protegido en el cdigo, ste puede continuar con el acceso a la
memoria de datos EEPROM pero no as el programador.

71

Registro de control (Control Register)


Registro EECON1

bit 7:5 No implementados: Ledos como 0


bit 4

EEIF: Bit de la bandera de interrupcin de una operacin de escritura en EEPROM


1 = Operacin de escritura completa (debe ser borrado por programa)
0 = La operacin de escritura no esta completa o no ha sido iniciada

bit 3

WRERR: Bit de la bandera de error en EEPROM


1 = Una operacin de escritura ha sido prematuramente terminada

(Cualquier ocurrencia de un arranque (Reset) MCLR o WDT durante la operacin normal)

0 = La operacin de escritura completada


bit 2

WREN: Bit de habilitacin de escritura en EEPROM


1 = Permite los ciclos de escritura
0 = Inhibe la escritura de datos en EEPROM

bit 1

WR: Bit de control de escritura


1 = Inicia un ciclo de escritura. Este bit es borrado internamente (por hardware) una
vez que un ciclo de escritura es completado. Solo puede ser prendido (pero no
borrado) por programa
0 = El ciclo de escritura del dato en EEPROM ha sido completado

bit 0

RD: Bit de control de lectura


1 = Inicia una lectura a EEPROM. La lectura toma un ciclo. El bit RD es borrado
internamente (por hardware). Solo puede ser prendido (pero no borrado) por
programa
0 = No se ha iniciado una lectura a EEPROM
R = Bit de lectura
W = Bit de escritura
U = Bit no implementado, ledo como 0

S = Bit para prender


- n = Valor al arranque (reset) POR

Nota 1: Futuros modelos tendrn este bit en el registro PIR.


Registro EEADR
El registro EEADR puede direccionar un mximo de 256 bytes de datos en EEPROM. Los bits
de direccin no usados son decodificados, lo que significa que estos bits deben ser siempre 0
para asegurar que la direccin se encuentre en el espacio de la memoria de datos EEPROM.
Registros EECON1 y EECON2
El registro EECON1 es un registro de control con 5 bits menos significantes implementados.
Los 3 bits ms significantes no son implementados y son ledos como 0.
Los bits de control RD y WR inician una lectura y escritura, respectivamente. Estos bits no
pueden ser borrados, solamente prendidos por programa. Ellos son borrados por hardware al

72

completar la operacin de lectura o escritura. La inhabilidad para borrar el bit WR por programa
previene la accidental terminacin de una operacin de escritura.
El bit WREN, cuando es prendido, permitir los ciclos de escritura. Al encendido (Power-up) el
bit WREN es borrado. El bit WRERR es prendido cuando una operacin de escritura es
interrumpida por la ocurrencia de un arranque (Reset) MCLR o WDT durante una operacin
normal. En estas situaciones, seguido a la condicin de arranque (Reset), el usuario puede
verificar el bit WRERR y re-escribir la localidad. El dato y la direccin permanecern sin cambio
en los registros EEDATA y EEADR.
El bit de la bandera de interrupcin EEIF es prendida cuando el ciclo de escritura es completo.
Este bit debe ser borrado por programa.
EECON2 no es un registro fsico. Las lecturas a este registro se leern como 0. El registro
EECON2 es utilizado exclusivamente en la secuencia de escritura de datos en EEPROM.
Leyendo la memoria de datos EEPROM
Para leer una localidad de la memoria de datos, el usuario deber primero escribir la direccin
en el registro EEADR y posteriormente prender el bit de control RD (EECON1<0>). El dato
estar disponible en el prximo ciclo de instruccin en el registro EEDATA, por lo tanto ste
podr ser ledo por la prxima instruccin. El registro EEDATA mantendr su valor hasta que
otra lectura o escritura sea hecha.
Ejemplo 8.1

Lectura de datos en EEPROM

Escribiendo en la memoria de datos EEPROM


Para escribir en una localidad de la memoria de datos, el usuario deber primero escribir la
direccin en el registro EEADR, luego escribir el dato en el registro EEDATA. Posteriormente el
usuario deber seguir una secuencia especfica para iniciar la escritura en cada byte.
Ejemplo 8.2

Escritura de datos en EEPROM

73

La escritura no iniciar si la secuencia de arriba no es exactamente seguida (escribir 55h al


registro EECON2, escribir AAh al registro EECON2 y luego prender el bit WR) para cada byte.
Es altamente recomendado que las interrupciones sean deshabilitadas durante este segmento
de cdigo.
Adicionalmente, el bit WREN en el registro EECON1 deber ser prendido para habilitar la
escritura. Este mecanismo previene de escrituras accidentales a la memoria EEPROM debido
a la ejecucin errante (inesperada) de cdigo (por ejemplo, prdida de programas). El usuario
deber mantener el bit WREN todo el tiempo excepto cuando vaya a ser actualizada la
memoria EEPROM. El bit WREN no es borrado por hardware.
Despus de que una secuencia de escritura ha sido iniciada, el borrar el bit WREN no afectar
este ciclo de escritura. El bit WR ser inhibido durante el tiempo en que el bit WREN se
encuentre apagado.
Una vez completado el ciclo de escritura, el bit WR es apagado por hardware y el bit EEIF
(EE Write Complete Interrupt Flag) es prendido. El usuario podr habilitar esta interrupcin o
leer este bit (polling). El bit EEIF deber ser apagado por programa.
Escritura y verificacin (Write Verify)
Dependiendo de la aplicacin, una buena prctica de programacin radica en verificar el dato
de la EEPROM despus de su escritura (Ejemplo 8.3). Esto deber ser hecho en aplicaciones
donde la EEPROM ser estresada hasta el lmite de la especificacin.
Ejemplo 8.3

Escritura y verificacin

Proteccin contra escrituras indeseables


Existen condiciones en las que el microcontrolador puede que no necesite escribir algn dato
en la memoria EEPROM. Para protegerlo de escrituras indeseables se han construido varios
mecanismos. En el arranque de encendido (Power-up), el bit WREN es apagado. Tambin, el
temporizador de encendido (Power-up Timer) de 72 milisegundos de duracin, previene las
escrituras a la memoria EEPROM.

74

La secuencia inicial de escritura y el bit WREN en conjunto, previenen una escritura accidental
durante el arranque Brown-out (Brown-out Reset), transitorios en el voltaje de alimentacin y un
mal funcionamiento del programa.
Operacin de la memoria EEPROM durante una configuracin de cdigo protegido
Cuando el microcontrolador se encuentra con cdigo protegido, el CPU es capz de leer y
escribir en la memoria EEPROM.
Para versiones de microcontroladores con ROM, existen dos bits de cdigo de proteccin. Uno
para la memoria de programa ROM y otro para la memoria de datos EEPROM. Ver las
especificaciones de programacin del modelo deseado para ms informacin acerca de estos
bits.
Inicializacin
El mdulo de datos EEPROM no tiene una secuencia de inicializacin como la tienen otros
mdulos. Para hacer una lectura de datos de la EEPROM refirase al ejemplo 8.1. Para hacer
una escritura de datos a la EEPROM refirase al ejemplo 8.2. Finalmente para verificar si la
escritura fu completada exitosamente, refirase al ejemplo 8.3.
As como para la memoria RAM de propsito general, es buena idea tambin inicializar todos
los datos de la memoria EEPROM a un estado conocido. Esta inicializacin puede ser
realizada al mismo tiempo en que el microcontrolador sea programado o sobre un modo de
diagnstico, ya que no sera deseable borrar la memoria EEPROM en cualquier secuencia de
arranque (Reset).

75

76

Interrupciones

Los microcontroladores PIC pueden tener varias fuentes de interrupcin. Estas fuentes
generalmente incluyen una fuente de interrupcin de cada mdulo perifrico, aunque algunos
mdulos pueden generar mltiples interrupciones (como el mdulo USART). Dichas fuentes de
interrupcin son:

Interrupcin en el pin INT (Interrupcin externa)


Interrupcin de sobre-flujo (overflow) del temporizador TMR0
Interrupcin por cambio en el puerto PORTB (pines RB7:RB4)
Interrupcin por cambio en el comparador
Interrupcin del puerto paralelo esclavo
Interrupciones del mdulo USART
Interrupcin de recepcin
Interrupcin de transmisin
Interrupcin de conversin completa del mdulo A/D
Interrupcin del mdulo LCD
Interrupcin de escritura completa en la memoria de datos EEPROM
Interrupcin de sobre-flujo (overflow) del temporizador Timer1
Interrupcin de sobre-flujo (overflow) del temporizador Timer2
Interrupcin del mdulo CCP
Interrupcin del mdulo SSP

Existe un solo registro usado para el control y el estado de las interrupciones. Este registro es:

INTCON

Adicionalmente, si el microcontrolador tiene interrupciones de perifricos, entonces deber


tener registros para poder habilitar las interrupciones de los mismos, as como registros para
mantener los bits de las banderas de interrupcin. Dependiendo del modelo, los registros son:

PIE1
PIR1
PIE2
PIR2

Generalmente son referidos nicamente como registros PIE y PIR. Si futuros modelos
proporcionan ms fuentes de interrupcin, entonces stos sern soportados por pares
adicionales de registros como PIE3 y PIR3.
El registro de control de interrupciones, INTCON, registra bits de bandera individuales para
requerimiento de interrupcin (Interrupt Request) centralizado.
Asimismo, posee varios bits de habilitacin de interrupciones individual y un bit de habilitacin
de interrupciones global.

77

El bit de habilitacin de interrupcin global (Global Interrupt Enable), GIE (INTCON<7>), habilita
(si est prendido) todas las interrupciones no-mascaradas (un-masked interrupts) o deshabilita
(si est apagado) todas las interrupciones. Interrupciones individuales pueden ser
deshabilitadas a travs de sus correspondientes bits de habilitacin contenidos en el registro
INTCON. El bit GIE es apagado en el arranque (Reset).
La instruccin de regreso de interrupcin, RETFIE, hace salir de la rutina de interrupcin as
como prender el bit GIE, lo cual permite ejecutar cualquier interrupcin pendiente.
El registro INTCON contiene las siguientes interrupciones: Interrupcin del pin INT, la
interrupcin por cambio en el puerto PORTB y la interrupcin de sobre-flujo (overflow) del
temporizador TMR0. Asimismo, este registro contiene el bit de habilitacin de interrupcin de
perifricos (Peripheral Interrupt Enable) PEIE, el cual habilitar/deshabilitar las interrupciones
de perifricos cuando este bit se encuentre prendido/apagado.
Cuando una interrupcin es atendida, el bit GIE es apagado, con el objeto de deshabilitar
posteriores interrupciones, la direccin de regreso es empujada dentro de la pila (stack) y el
contador de programa (PC) es cargado con 0004h. Una vez estando en la rutina de servicio a
la interrupcin, la fuente o fuentes de interrupcin puede ser determinada mediante la lectura
(polling) de los bits de las banderas de interrupcin. Generalmente, estos bits de las banderas
deben ser apagados por programa antes de volver a habilitar las interrupciones globales para
prevenir interrupciones recursivas.
As pues, una vez ejecutando la rutina de servicio de interrupcin, la fuente de interrupcin
podr ser determinada mediante la lectura de los bits de las banderas de interrupcin. Estos
bits de banderas de interrupcin individuales son prendidos independientemente del estado
que guarden los bits de mscara correspondientes o el bit GIE.
Nota 1: Cuando una instruccin que apague el bit GIE es ejecutada, cualquier interrupcin que
estuviese pendiente para su ejecucin en el prximo ciclo, ser ignorada. El CPU
ejecutar una NOP en el siguiente ciclo, pero sin embargo, las interrupciones
ignoradas todava estarn pendientes de ser atendidas en el momento en que el bit
GIE vuelva a ser habilitado (encendido).

78

Figura 9.1

Lgica de Interrupcin

Registros de control
Generalmente los microcontroladores poseen un mnimo de tres registros asociados con
interrupciones. Uno de ellos es el registro INTCON el cual contiene el bit GIE (Global Interrupt
Enable) y el bit PEIE (Peripheral Interrupt Enable). El otro par de registros son el PIE/PIR, los
cuales habilitan las interrupciones de los perifricos y despliegan el estado de las
interrupciones.
Registro INTCON
Este registro es de lectura y escritura y contiene varios bits de habilitacin y de banderas de
interrupcin.
Nota:

Los bits de bandera de interrupcin son prendidos cuando una condicin de


interrupcin ocurre, independientemente de su correspondiente bit de habilitacin o del
bit de habilitacin global, GIE (INTCON<7>). Esta caracterstica permite la lectura
(polling) por programa.

79

Registro INTCON

bit 7

GIE: Bit de habilitacin global de interrupcin (Global Interrupt Enable)


1 = Habilita todas las interrupciones no-mascaradas (un-masked interrupts)
0 = Deshabilita todas las interrupciones

bit 6

PEIE: Bit de habilitacin de interrupciones de perifricos (Peripheral Interrupt Enable)


1 = Habilita todas las interrupciones no-mascaradas de perifricos
0 = Deshabilita todas las interrupciones de perifricos

bit 5

T0IE: Bit de habilitacin de interrupcin por sobre-flujo del temporizador TMR0


(TMR0 Overflow Interrupt Enable)
1 = Habilita las interrupciones de sobre-flujo del temporizador TMR0
0 = Deshabilita las interrupciones de sobre-flujo del temporizador TMR0

bit 4

INTE: Bit de habilitacin de interrupcin externa INT (INT External Interrupt Enable)
1 = Habilita las interrupciones externas INT
0 = Deshabilita las interrupciones externas INT

bit 3

RBIE

bit 2

T0IF: Bit de bandera de interrupcin por sobre-flujo en el temporizador TMR0


(TMR0 Overflow Interrupt Flag)
1 = Un sobre-flujo ha ocurrido en TMR0 (Debe ser apagado por programa)
0 = Ningn sobre-flujo ha ocurrido en TMR0

bit 1

INTF: Bit de bandera de interrupcin externa INT (INT External Interrupt Flag)
1 = Una interrupcin externa INT ha ocurrido (Debe ser apagado por programa)
0 = Ninguna interrupcin externa INT ha ocurrido

bit 0

: Bit de bandera de interrupcin por cambio en el puerto PORTB


(RB Port Change Interrupt Flag)
1 = Al menos un pin RB7:RB4 cambi su estado (Debe ser apagado por programa)
0 = Ninguno de los pines RB7:RB4 cambi su estado

(1)

: Bit de habilitacin de interrupcin por cambio en el puerto PORTB


(RB Port Change Interrupt Enable)
1 = Habilita las interrupciones por cambio en PORTB
0 = Deshabilita las interrupciones por cambio en PORTB

RBIF

(1)

R = Bit de lectura
W = Bit de escritura
U = Bit no implementado, ledo como 0

- n = Valor en el arranque POR

Nota 1: Un algunos modelos, el bit RBIE es tambin conocido como GPIE y el bit RBIF es
tambin conocido como GPIF.
Nota 2: Algunos modelos pudieran no tener esta caracterstica. Para estos modelos, este bit es
reservado.
Nota 3: En modelos con una sola interrupcin de perifrico, este bit pudiera ser EEIE o ADIE.

80

Registro(s) PIE
Dependiendo del nmero de fuentes de interrupcin de perifricos, existirn el mismo nmero
de registros de habilitacin de interrupcin de perifricos (PIE1, PIE2). Estos registros
contienen los bits de habilitacin individual para interrupciones de perifricos. Estos registros
sern generalmente referidos como PIE. Si el microcontrolador posee un registro PIE, el bit
PEIE deber prenderse para habilitar cualquiera de estas interrupciones de perifricos.
Nota:

El bit PEIE (INTCON<6>) deber ser encendido para habilitar cualquiera de estas
interrupciones de perifricos.

Aunque los bits del registro PIE tienen una localidad general de los bits con cada uno de los
registros, futuros modelos podran no tener consistencia en su posicin. Esto no ser un
problema si son utilizados los archivos include proporcionados por MICROCHIP, para el uso
simblico de estos bits. Esto permitir al ensamblador/compilador, tomar automticamente el
cuidado requerido de poner estos bits en sus respectivos registros.
Registro PIE

bit

TMR1IE: Bit de habilitacin de interrupcin de sobre-flujo en el temporizador TMR1


(TMR1 Overflow Interrupt Enable)
1 = Habilita las interrupciones de sobre-flujo del temporizador TMR1
0 = Deshabilita las interrupciones de sobre-flujo del temporizador TMR1

bit

TMR2IE: Bit de habilitacin de interrupcin de similitud (match) del temporizador


TMR2 a PR2 (TMR2 to PR2 Match Interrupt Enable)
1 = Habilita las interrupciones de similitud (match) del temporizador TMR2 a PR2
0 = Deshabilita las interrupciones de similitud (match) del temporizador TMR2 a PR2

bit

CCP1IE: Bit de habilitacin de interrupcin del mdulo CCP1


1 = Habilita las interrupciones del mdulo CCP1
0 = Deshabilita las interrupciones del mdulo CCP1

bit

CCP2IE: Bit de habilitacin de interrupcin del mdulo CCP2


1 = Habilita las interrupciones del mdulo CCP2
0 = Deshabilita las interrupciones del mdulo CCP2

bit

SSPIE: Bit de habilitacin de interrupcin del puerto serial sincrnico


(Synchronous Serial Port Interrupt Enable)
1 = Habilita las interrupciones del mdulo SSP
0 = Deshabilita las interrupciones del mdulo SSP

bit

RCIE: Bit de habilitacin de interrupcin de recepcin del USART


(USART Receive Interrupt Enable)
1 = Habilita las interrupciones de recepcin del USART
0 = Deshabilita las interrupciones de recepcin del USART

bit

TXIE: Bit de habilitacin de interrupcin de transmisin del USART


(USART Transmit Interrupt Enable)
1 = Habilita las interrupciones de transmisin del USART

81

0 = Deshabilita las interrupciones de transmisin del USART


bit

ADIE: Bit de habilitacin de interrupcin del convertidor A/D


(A/D Converter Interrupt Enable)
1 = Habilita las interrupciones del convertidor A/D
0 = Deshabilita las interrupciones del convertidor A/D

bit

ADCIE: Bit de habilitacin de interrupcin del viaje del comparador de la pendiente del
convertidor A/D (Slope A/D Converter Comparator Trip Interrupt Enable)
1 = Habilita las interrupciones de la pendiente del Convertidor A/D
0 = Deshabilita las interrupciones de la pendiente del Convertidor A/D

bit

OVFIE: Bit de habilitacin de interrupcin del sobre-flujo del temporizador TMR de la


pendiente del convertidor A/D (Slope A/D TMR Overflow Interrupt Enable)
1 = Habilita las interrupciones del sobre-flujo del TMR de la pendiente del A/D
0 = Deshabilita las interrupciones del sobre-flujo del TMR de la pendiente del A/D

bit

PSPIE: Bit de habilitacin de interrupcin de lectura/escritura al puerto paralelo esclavo


(Parallel Slave Port Read/Write Interrupt Enable)
1 = Habilita las interrupciones de lectura/escritura del PSP
0 = Deshabilita las interrupciones de lectura/escritura del PSP

bit

EEIE: Bit de habilitacin de interrupcin de escritura completa a EE


(EE Write Complete Interrupt Enable)
1 = Habilita las interrupciones de escritura completa a EE
0 = Deshabilita las interrupciones de escritura completa a EE

bit

LCDIE: Bit de habilitacin de interrupcin del mdulo LCD (LCD Interrupt Enable)
1 = Habilita las interrupciones del mdulo LCD
0 = Deshabilita las interrupciones del mdulo LCD

bit

CMIE: Bit de habilitacin de interrupcin del mdulo Comparador


(Comparator Interrupt Enable)
1 = Habilita las interrupciones del mdulo Comparador
0 = Deshabilita las interrupciones del mdulo Comparador

R = Bit de lectura
W = Bit de escritura
U = Bit no implementado, ledo como 0
Nota 1:

- n = Valor en el arranque POR

La posicin de los bits de habilitacin es dependiente del modelo del


microcontrolador, por lo que deber referirse a la hoja de especificaciones
tcnicas (Datasheet) correspondiente.

Registros PIR
Dependiendo del nmero de fuentes de interrupcin de perifricos, existirn el mismo nmero
de registros de banderas de interrupcin de perifricos (PIR1, PIR2). Estos registros contienen
los bits de banderas individuales para interrupciones de perifricos. Estos registros sern
generalmente referidos como PIR.

82

Nota 1:

Los bits de banderas de interrupcin son encendidos cuando una condicin de


interrupcin ocurre, independientemente del estado de su correspondiente bit
de habilitacin o del bit de habilitacin global, GIE (INTCON<7>).

Nota 2:

El usuario del programa deber asegurar que los apropiados bits de bandera
de interrupcin sean apagados (por programa) antes de volver a habilitar las
interrupciones y despus de dar servicio a esa interrupcin.

Aunque los bits del registro PIR tienen una localidad general de los bits con cada uno de los
registros, futuros modelos podran no tener consistencia en su posicin. Esto no ser un
problema si son utilizados los archivos include proporcionados por MICROCHIP, para el uso
simblico de estos bits. Esto permitir al ensamblador/compilador, tomar automticamente el
cuidado requerido de poner estos bits en sus respectivos registros.
Registro PIR

bit

TMR1IF: Bit de bandera de interrupcin de sobre-flujo en el temporizador TMR1


(TMR1 Overflow Interrupt Flag)
1 = El registro del temporizador TMR1 ha tenido un sobre-flujo
0 = El registro del temporizador TMR1 no ha tenido un sobre-flujo

bit

TMR2IF: Bit de bandera de interrupcin de similitud (match) del temporizador


TMR2 a PR2 (TMR2 to PR2 Match Interrupt Flag)
1 = Una similitud (match) del temporizador TMR2 a PR2 ha ocurrido
0 = Ninguna similitud (match) del temporizador TMR2 a PR2 ha ocurrido

bit

CCP1IF: Bit de bandera de interrupcin del mdulo CCP1


En modo captura:
1 = Una captura del registro TMR1 ha ocurrido. (Deber ser apagado por programa)
0 = Ninguna captura del registro TMR1 ha ocurrido
En modo comparacin:
1 = Una similitud (match) de comparacin del registro TMR1 ha ocurrido.
(Deber ser apagado por programa)
0 = Ninguna similitud (match) de comparacin del registro TMR1 ha ocurrido.
En modo PWM:
No usado en este modo

bit

CCP2IF: Bit de bandera de interrupcin del mdulo CCP2


En modo captura:
1 = Una captura del registro TMR1 ha ocurrido. (Deber ser apagado por programa)
0 = Ninguna captura del registro TMR1 ha ocurrido
En modo comparacin:
1 = Una similitud (match) de comparacin del registro TMR1 ha ocurrido.
(Deber ser apagado por programa)
0 = Ninguna similitud (match) de comparacin del registro TMR1 ha ocurrido.

83

En modo PWM:
No usado en este modo
bit

SSPIF: Bit de bandera de interrupcin del puerto serial sincrnico


(Synchronous Serial Port Interrupt Flag
1 = La transmisin/recepcin est completa
0 = Esperando a transmitir/recibir

bit

RCIF: Bit de bandera de interrupcin de recepcin del USART


(USART Receive Interrupt Flag
1 = El buffer de recepcin del USART, RCREG esta lleno
(apagado cuando el registro RCREG es ledo)
0 = El buffer de recepcin del USART, RCREG esta vaco

bit

TXIF: Bit de bandera de interrupcin de transmisin del USART


(USART Transmit Interrupt Flag)
1 = El buffer de transmisin del USART, TXREG esta lleno
(apagado cuando el registro TXREG es ledo)
0 = El buffer de transmisin del USART, TXREG esta vaco

bit

ADIF: Bit de bandera de interrupcin del convertidor A/D


(A/D Converter Interrupt Flag)
1 = La conversin A/D ha sido completada. (Deber ser apagado por programa)
0 = La conversin A/D no ha sido completada.

bit

ADCIF: Bit de bandera de interrupcin del viaje del comparador de la pendiente del
convertidor A/D (Slope A/D Converter Comparator Trip Interrupt Flag)
1 = Una conversin A/D ha sido completada. (Deber ser apagado por programa)
0 = La conversin A/D no ha sido completada.

bit

OVFIF: Bit de bandera de interrupcin del sobre-flujo del temporizador TMR de la


pendiente del convertidor A/D (Slope A/D TMR Overflow Interrupt Flag)
1 = Hubo un sobre-flujo del TMR de la pendiente del A/D.
(Deber ser apagado por programa)
0 = No hubo un sobre-flujo del TMR de la pendiente del A/D.

bit

PSPIF: Bit de bandera de interrupcin de lectura/escritura al puerto paralelo esclavo


(Parallel Slave Port Read/Write Interrupt Flag)
1 = Una operacin de lectura o escritura ha tomado lugar.
(Deber ser apagado por programa)
0 = Ninguna operacin de lectura o escritura ha tomado lugar.

bit

EEIF: Bit de bandera de interrupcin de escritura completa a EE


(EE Write Complete Interrupt Flag)
1 = La operacin de escritura a EE ha sido completada
(Deber ser apagado por programa)
0 = La operacin de escritura a EE no ha sido completada

bit

LCDIF: Bit de bandera de interrupcin del mdulo LCD (LCD Interrupt Flag)
1 = Una interrupcin del mdulo LCD ha ocurrido.
(Deber ser apagado por programa)
0 = Ninguna interrupcin del mdulo LCD ha ocurrido.

bit

CMIF: Bit de bandera de interrupcin del mdulo Comparador


(Comparator Interrupt Flag)
1 = La entrada del comparador ha cambiado. (Deber ser apagado por programa)

84

0 = La entrada del comparador no ha cambiado.

R = Bit de lectura
W = Bit de escritura
U = Bit no implementado, ledo como 0
Nota 1:

- n = Valor en el arranque POR

La posicin de los bits de banderas es dependiente del modelo del


microcontrolador, por lo que deber referirse a la hoja de especificaciones
tcnicas (Datasheet) correspondiente.

Latencia de la interrupcin
La latencia de la interrupcin es definida como el tiempo que transcurre desde el evento de la
interrupcin (cuando la bandera de interrupcin es prendida) hasta el tiempo en que la
instruccin ubicada en la direccin 0004h comienza a ser ejecutada (cuando esa interrupcin
es habilitada).
Para interrupciones sincrnicas (generalmente internas), la latencia es de 3 TCY.
Para interrupciones asncronas (generalmente externas), tales como la interrupcin INT o un
cambio en el puerto RB, la latencia es de 3 3.75 TCY (ciclos de instruccin). La latencia exacta
depende de cuando el evento de interrupcin ocurre (figura 9.2) en relacin al ciclo de
instruccin.
La latencia es la misma para instrucciones de uno o dos ciclos.
Interrupciones INT y Externas
La interrupcin externa sobre el pin INT es disparada con un flanco (edge triggered): ya sea de
subida (rising) si el bit INTEDG (OPTION<6>) es prendido o de bajada (falling) si el bit INTEDG
es apagado. Cuando un flanco (edge) vlido aparece en el pin INT, el bit INTF (INTCON<1>)
es encendido. Esta interrupcin podr ser habilitada o deshabilitada mediante el encendido o
apagado del bit de habilitacin INTE (INTCON<4>). El bit INTF debe ser apagado por programa
en la rutina de servicio a interrupcin antes de volver a habilitar esta interrupcin. La
interrupcin INT podr despertar (wake-up) al procesador de un estado de reposo (sleep),
siempre y cuando el bit INTE haya sido encendido antes de ir al estado de reposo (sleep). El
estado del bit GIE decidir si el procesador pasa el control al vector de interrupcin o no,
despus de despertar (wake-up). Vea el captulo Temporizador de guardia (Watchdog) y Modo
de reposo (sleep) para ms detalles.
Figura 9.2

Tiempos del pin INT y otras interrupciones externas

85

Nota:

Cualquier interrupcin causada por una seal externa (tales como temporizadores,
captura, cambio de estado en un puerto) tendrn similares tiempos.

Contexto salvado durante interrupciones


Durante una interrupcin, solamente el contador de programa (PC) es salvado en la pila
(stack). Generalmente, el usuario desear salvar algunos registros clave durante una
interrupcin. Esto es, el registro de trabajo W y el registro STATUS. Esto tiene que ser
implementado en el programa.
La accin de salvar informacin es comnmente referida como empujar (PUSHing), mientras
que la accin de realmacenar la informacin antes de regresar es comnmente referida como
jalar (POPing). Estas acciones (PUSH, POP) no son mnemnicos de instrucciones sino que
son acciones conceptuales. Esta accin puede ser implementada mediante una secuencia de
instrucciones. Para facilidad de transportabilidad de cdigo, estos segmentos de cdigo pueden
ser implementados dentro de macros (Ver el captulo de Ensamblador para ver los detalles de
como crear macros).
El ejemplo 9.1 salva (store) y realmacena (restore) el registro STATUS y el registro W para
microcontroladores con memoria RAM comn (tal como el PIC16C77). El registro del usuario
denominado W_TEMP, debe ser definido en todos los bancos y tener la misma posicin
relativa (o mismo offset) desde la direccin base del banco (por ejemplo, W_TEMP es
definido en la direccin 0x70 0x7F en el banco0). El registro de usuario, STATUS_TEMP,
debe ser definido en el banco0. En este ejemplo STATUS_TEMP se encuentra en el banco0.
Los pasos del ejemplo 9.1:
1. Salva el registro W independientemente del banco activo.

86

2.
3.
4.
5.

Salva el registro STATUS en el banco0.


Ejecuta el cdigo de la rutina de servicio de interrupcin (ISR).
Realmacena el registro STATUS (y el registro del bit de seleccin del banco).
Realmacena el registro W.

Si se requiere salvar otras localidades adicionales, estas debern salvarse antes de ejecutar el
cdigo de la rutina de servicio de interrupcin (ISR), pero despus de ser salvado el registro
STATUS (paso 2) y realmacenados antes de realmacenar el registro STATUS (paso 4).
Ejemplo 9.1

Salvando el registro STATUS y el registro W


(para microcontroladores con memoria RAM comn)

El ejemplo 9.2 almacena (store) y realmacena (restore) el registro STATUS y el registro W para
microcontroladores sin memoria RAM comn (tal como el PIC16C74A). El registro del usuario,
W_TEMP, deber ser definido en todos los bancos y con la misma posicin relativa (mismo
offset) con respecto a la direccin base del banco (por ejemplo, W_TEMP es definido en 0x70
0x7F en el banco0). Asimismo, el registro de usuario, STATUS_TEMP, deber ser definido
en el banco0.
Dentro del rango 0x70 0x7F (banco0), el registro W_TEMP se espera que corresponda a
localidades similares en los otros bancos y ser dedicado para salvar el registro W.
Los pasos del ejemplo 9.2:
1.
2.
3.
4.
5.

Almacena (store) el registro W independientemente del banco activo.


Almacena (store) el registro STATUS en el banco0.
Ejecuta el cdigo de la rutina de servicio a interrupcin (ISR).
Realmacena (restore) el registro STATUS (y el registro del bit de seleccin del banco).
Realmacena (restore) el registro W.

Si se requiriera salvar localidades adicionales antes de la ejecucin del cdigo de la rutina de


servicio a interrupcin (ISR), estas debern de salvarse despus de salvar el registro STATUS
(paso 2) y realmacenadas antes de realmacenar el registro STATUS (paso 4).

87

Ejemplo 9.2

Salvando el registro STATUS y el registro W en RAM


(para microcontroladores sin memoria RAM comn)

El ejemplo 9.3 almacena (store) y realmacena (restore) el registro STATUS y el registro W para
microcontroladores con memoria RAM de propsito general solo en el banco0 (tal como el
PIC16C620). El banco deber ser probado antes de salvar cualquiera de los registros del
usuario. W_TEMP deber ser definido en todos los bancos y con la misma posicin relativa
(mismo offset) de la direccin base del banco. El registro de usuario, STATUS_TEMP, deber
ser definido en el banco0.
Los pasos del ejemplo 9.3:
1.
2.
3.
4.
5.
6.

Prueba el banco activo.


Almacena (store) el registro W independientemente del banco activo.
Almacena (store) el registro STATUS en el banco0.
Ejecuta el cdigo de la rutina de servicio a interrupcin (ISR).
Realmacena (restore) el registro STATUS (y el registro del bit de seleccin del banco).
Realmacena (restore) el registro W.

Si se requiriera salvar localidades adicionales antes de la ejecucin del cdigo de la rutina de


servicio a interrupcin (ISR), estas debern de salvarse despus de salvar el registro STATUS
(paso 2) y realmacenadas antes de realmacenar el registro STATUS (paso 4).

88

Ejemplo 9.3 Salvando el registro STATUS y el registro W en RAM


(para microcontroladores con RAM de propsito general solo en el banco0)

Inicializacin
El ejemplo 9.4 muestra la inicializacin y habilitacin de las interrupciones del microcontrolador,
donde el valor PIE1_MASK1 es el valor a escribir en el registro de habilitacin de
interrupciones.
El ejemplo 9.5 muestra como crear definiciones de macros para funciones. Los macros
deben ser definidos antes de que ellos sean usados. Para facilitar la depuracin (debugging),
los macros debern ser puestos en otros archivos que sern incluidos al tiempo de
ensamblarlos. Esto permitir que la fuente sea vista sin toda la informacin requerida por los
macros. Estos archivos debern ser incluidos antes de que el macro sea usado, pero esto
simplifica la depuracin (debugging), si todos los archivos include son creados al inicio del
archivo fuente. El ejemplo 9.6 muestra esta estructura.
El ejemplo 9.7 muestra una estructura tpica de la rutina de servicio a interrupcin (ISR). Esta
rutina usa macros para salvar (store) y realmacenar (restore) los registros antes de la
ejecucin del cdigo de interrupcin.

89

Ejemplo 9.4

Ejemplo 9.5

Inicializacin y habilitacin de interrupciones

Salvado y realmacenamiento de registros como macros

Ejemplo 9.6

Esquema del archivo fuente

90

Ejemplo 9.7

Tpica rutina de servicio de interrupcin (ISR)

91

92

10 Puertos de Entrada/Salida (I/O)

Los pines de entrada/salida (I/O pins) pueden ser considerados como la parte ms simple de
los perifricos. Estos permiten al microcontrolador, monitorear y controlar otros dispositivos.
Para agregar flexibilidad y funcionalidad al microcontrolador, algunos pines son multiplexados
con una o varias funciones alternativas, las cuales dependern del modelo del mismo. En
general, cuando un perifrico esta funcionando, ese pin no podr ser usado como un pin de
entrada/salida (I/O) de propsito general.
Para muchos puertos, la direccin de los pines de entrada/salida (I/O) es controlada por el
registro de direccin del dato, llamado registro TRIS.
TRIS<x> controla la direccin del puerto PORT<x>. Un 1 en el bit TRIS corresponder a que
ese pin sea una entrada, mientras que un 0 corresponder a que ese pin sea una salida. Una
manera muy sencilla de recordar es que un 1 se mira como la I de Input (entrada) y un 0
se mira como la O de Output (salida).
El registro PORTx corresponde a un latch para sacar el dato. Cuando el puerto PORTx es
ledo, el microcontrolador lee el nivel presente sobre el pin de entrada/salida (I/O pin) (no el
latch). Esto significa que deber tenerse cuidado con los comandos de lectura-modificacinescritura (read-modify-write) sobre los puertos as como al cambiar la direccin de un pin de
una entrada a una salida.
La figura 10.1 muestra un tpico puerto de entrada/salida (I/O port). Esta figura no toma en
cuenta las funciones de los perifricos que puedan estar multiplexados con el pin de
entrada/salida (I/O port). Leyendo el registro PORTx leer el estado de los pines, mientras que
escribindolo, escribir en el latch del puerto. Todas las operaciones de escritura (tales como
las instrucciones BSF y BCF) son operaciones de lectura-modificacin-escritura (read-modifywrite). De esta manera, una escritura a un puerto implicar que los pines del puerto sern
ledos, este valor ser modificado y entonces escrito en el latch del puerto.

93

Figura 10.1

Puerto de entrada/salida (I/O port) tpico

Cuando las funciones de los perifricos son multiplexados con los pines de entrada/salida
(I/O), la funcionalidad de dichos pines podr cambiar para acomodarse a los requerimientos del
mdulo perifrico. Ejemplos de esto son: el mdulo convertidor analgico/digital (A/D) y el
mdulo de manejo del LCD, los cuales forzarn el pin de entrada/salida (I/O) a la funcin
perifrica cuando el microcontrolador sea arrancado (Reset). En el lado del mdulo A/D, esto
previene que el microcontrolador no tenga un consumo excesivo de corriente si cualquier nivel
analgico estuviera presente sobre los pines A/D despus de la ocurrencia de un arranque
(Reset).
Con algunos perifricos, el bit TRIS es sobrescrito mientras que el perifrico es habilitado. Por
lo tanto, instrucciones de lectura-modificacin-escritura (read-modify-write) (BSF, BCF,
XORWF) con TRIS como destino debern ser evitadas. El usuario deber referirse al captulo
del perifrico correspondiente para configurar correctamente el bit TRIS.
Los pines del puerto PORTx podran estar multiplexados con entradas analgicas y entradas
analgicas VREF. La operacin de cada uno de estos pines es seleccionada a ser, o una
entrada analgica o una entrada/salida (I/O) digital, mediante el registro de control ADCON1
(A/D Control Register1). Cuando sean seleccionados como una entrada analgica, estos pines
sern ledos como 0.
Los registros TRIS controlan la direccin de los pines del puerto, aun cuando estos estn
siendo usados como entradas analgicas. El usuario deber asegurarse que los bits TRIS sean
mantenidos encendidos cuando los pines sean usados como entradas analgicas.
Nota 1:

Si los pines son multiplexados con entradas analgicas, entonces en el


arranque de encendido (Power-on Reset) estos pines sern configurados como

94

entradas analgicas, por el registro ADCON1. Los pines del puerto


configurados como entradas analgicas sern ledos como 0.
Nota 2:

Si los pines son multiplexados con entradas con comparador, entonces en el


arranque de encendido (Power-on Reset) estos pines son configurados como
entradas analgicas, por el registro CMCON. Los pines del puerto configurados
como entradas analgicas sern ledos como 0.

Nota 3:

Si los pines son multiplexados con el manejador de segmentos del LCD,


entonces en el arranque de encendido (Power-on Reset) estos pines sern
configurados como manejadores de segmentos del LCD, por el registro
LCDSE. Para configurar los pines como un puerto digital, los bits
correspondientes en el registro LCDSE debern ser apagados. Cualquier bit
encendido en el registro LCDSE sustituir cualquier bit prendido en el
correspondiente bit TRIS.

Nota 4:

Los pines pueden ser multiplexados con el puerto paralelo esclavo (Parallel
Slave Port) (PSP). Para que el puerto PSP funcione, los pines de entrada/salida
(I/O) debern estar configurados como entradas digitales y el bit PSPMODE
deber estar encendido.

Nota 5:

Hasta el momento, el puerto paralelo esclavo (Parallel Slave Port) (PSP) es


nicamente multiplexado con el puerto PORTD y el puerto PORTE. Este
puerto se habilita cuando el bit PSPMODE es encendido. En este modo, el
usuario deber asegurarse de que los bits TRISE sean encendidos (los pines
configurados como entradas digitales) y que el puerto PORTE sea configurado
como entrada/salida (I/O) digital. El puerto PORTD sobrepondr (override) los
valores en el registro TRISD. En este modo los amplificadores (buffers) de las
entradas son TTL. Los bits de control para la operacin del PSP estn
localizados en TRISE.

El puerto PORTA y el registro TRISA


El pin RA4 es una entrada del tipo Schmitt Trigger y una salida del tipo de drenaje abierto
(open drain). Todos los pines RA del puerto PORTA tienen niveles de entrada TTL y unos
manejadores de salida CMOS completos (full CMOS output drivers). Todos los pines tienen bits
de direccin de dato (registros TRIS) los cuales pueden configurar estos pines como entrada o
como salida.
Encendiendo el bit del registro TRISA pondr el manejador de salida correspondiente en un
modo de alta impedancia. Apagando el bit en el registro TRISA pondr el contenido del la
salida del latch sobre los pines seleccionados.
Ejemplo 10.1 Inicializacin del puerto PORTA

95

Figura 10.2

Diagrma a bloques de los pines RA3:RA0 y RA5

96

Figura 10.3

Diagrma a bloques del pin RA4

El puerto PORTB y el registro TRISB


El puerto PORTB es un puerto bidireccional de 8 bits. El correspondiente registro de direccin
del dato es el registro TRISB. Encendiendo un bit en el registro TRISB pone al manejador de
salida (output driver) correspondiente en el modo de entrada de alta impedancia. Apagando el
bit en el registro TRISB pone el contenido del latch de salida sobre los pines seleccionados.
Ejemplo 10.2 Inicializando el puerto PORTB

Cada uno de los pines del puerto PORTB tienen una dbil resistencia interna de pull-up. Un
simple bit de control puede habilitar todas estas resistencias. Esto es ejecutado mediante el
apagado del bit RBPU (OPTION<7>). Las resistencias de pull-up son automticamente

97

deshabilitadas cuando el puerto PORTB es configurado como salida. Las resistencias de pullup son deshabilitadas en el arranque de encendido (Power-on Reset).
Figura 10.4

Diagrma de bloques de los pines RB3:RB0

Cuatro de los pines del puerto PORTB, RB7:RB4, poseen la caracterstica de interrumpir en un
cambio de estado. Solamente los pines configurados como entradas podrn causar a que
ocurra esta interrupcin (esto es, cualquier pin RB7:RB4 configurado como salida es excluido
de la interrupcin por comparacin de cambio). Los pines de entrada (de RB7:RB4) son
comparados con el viejo valor ledos en la ltima lectura del PORTB. Las salidas no
coincidentes (mismatch) de RB7:RB4 hacen la funcin OR juntas para generar la interrupcin
por cambio en RB, con el bit de bandera RBIF (INTCON<0>).
Esta interrupcin podr despertar (wake-up) al microcontrolador del estado de reposo (sleep).
El usuario, en la rutina de servicio a interrupcin, podr apagar la interrupcin de la siguiente
manera:
a) Cualquier lectura o escritura al puerto PORTB. Esto terminar la condicin de no
coincidencia (mismatch).
b) Apagando el bit de bandera RBIF.

98

Una condicin de no coincidencia (mismatch) continuar prendiendo el bit de bandera RBIF.


Leyendo el PORTB terminar la condicin de no coincidencia (mismatch), y permitir apagar el
bit de bandera RBIF.
Esta caracterstica de interrupcin aunada a las resistencias de pull-up configurables por
programa sobre estos cuatro pines, permitirn acoplar fcilmente un teclado y hacer posible el
despertar del microcontrolador al presionar una tecla.
La caracterstica de interrupcin por cambio en RB es recomendada para despertar (wake-up)
al presionar una tecla y en operaciones donde el PORTB es solamente utilizada con esta
caracterstica. La lectura (polling) del puerto PORTB no es recomendada mientras se est
usando la interrupcin por cambio en RB.
Figura 10.5

Diagrma de bloques de los pines RB7:RB4

99

El puerto PORTC y el registro TRISC


El puerto PORTC es un puerto bidireccional de 8 bits. Cada pin es individualmente configurable
como una entrada o como una salida mediante el registro TRISC. Los pines del PORTC tienen
amplificadores (buffers) de entrada Schmitt Trigger. Cuando son habilitadas las funciones
perifricas, un cuidado especial deber ser tomado al definir los bits TRIS para cada pin del
PORTC. Algunos perifricos dominan sobre el bit TRIS haciendo el pin una salida, mientras
que otros perifricos dominan sobre el bit TRIS haciendo el pin una entrada.
Ejemplo 10.3 Inicializando el puerto PORTC

Figura 10.6 Diagrma de bloques del PORTC (Perifrico con dominancia en la salida)

El puerto PORTD y el registro TRISD


El puerto PORTD es un puerto bidireccional de 8 bits. Cada pin es individualmente configurable
como entrada o como salida mediante el registro TRISD.

100

Ejemplo 10.4 Inicializando el puerto PORTD

Figura 10.7

Diagrma de bloques del PORTD (En modo I/O Port)

El puerto PORTE y el registro TRISE


El puerto PORTE puede ser de hasta 8 bits con amplificadores (buffers) de entrada Schmitt
Trigger. Cada pin es individualmente configurable como entrada o como salida.

101

Ejemplo 10.5 Inicializando el PORTE

Figura 10.8

Nota:

Diagrma a bloques del PORTE (en modo I/O Port)

En algunos modelos con PORTE, los bits ms significantes del registro TRISE son
utilizados por los bits de control y estado del puerto paralelo esclavo.

El puerto PORTF y el registro TRISF


El puerto PORTF es un puerto digital de entrada nicamente. Cada pin es multiplexado con
los manejadores de los segmentos LCD (LCD segment driver). Estos pines tienen
amplificadores (buffers) de entrada Schmitt Trigger.

102

Ejemplo 10.6 Inicializando el PORTF

Figura 10.9

Diagrma de bloques del PORTF LCD

El puerto PORTG y el registro TRISG


El puerto PORTG es un puerto digital de entrada nicamente. Cada pin es multiplexado con
los manejadores de los segmentos LCD (LCD segment driver). Estos pines tienen
amplificadores (buffers) de entrada Schmitt Trigger.
Ejemplo 10.6 Inicializando el PORTG

103

Figura 10.9

Diagrma de bloques del PORTG LCD

El registro GPIO y el registro TRISGP


El registro GPIO es un registro de entrada/salida (I/O) de 8 bits. Solamente los seis bits menos
significantes son implementados (GP5:GP0). Los bits 7 y 6 no son implementados y son ledos
como 0. Cualquier pin GPIO (excepto GP3) podr ser programado individualmente como
entrada o como salida. El pin GP3 es de entrada nicamente.
El registro TRISGP controla la direccin del dato para los pines GPIO. Un 1 en el bit del
registro TRISGP pondr la salida (output driver) correspondiente en modo de alta impedancia.
Un 0 pondr el contenido del latch de dato de salida sobre el pin, habilitando el amplificador
(buffer) de salida. La excepcin es GP3, la cual es nicamente entrada y su bit TRIS ser ledo
siempre como 1. Despus del arranque (Reset), el registro TRISGP ser todo 1s,
configurando como entradas todos los pines.
Una lectura del puerto GPIO, leer los pines, no las salidas del latch de datos. Cualquier
entrada deber estar presente hasta que sea leda por una instruccin de entrada (o sea,
MOVF GPIO, W). Las salidas son atrapadas (latched) y permanecern sin cambio hasta que el
latch sea sobrescrito.

104

Ejemplo 10.8 Inicializando el puerto GPIO

Figura 10.11

Diagrma de bloque de los pines GP5:GP0

La palabra de configuracin (configuration word) puede poner varias entradas/salidas para


alternar funciones. Cuando stas acten como funciones alternas, los pines sern ledos como
0. Los pines GP0, GP1 y GP3 podrn ser configurados con resistencias dbiles de pull-up
as como con interrupcin por cambio de estado, en donde ambas caractersticas no son
seleccionables por pin. La interrupcin por cambio de estado en el puerto es habilitada
mediante el encendido del bit INTCON<3>. Si los bits de configuracin del microcontrolador
seleccionaran uno de los modos del oscilador externo, las funciones GPIO de los pines GP4 y
GP5 seran sobrepuestos y dichos pines seran usados para el oscilador.
Consideraciones de programacin de las entradas/salidas (I/O)
Cuando se utilicen los puertos (y GPIO) como entrada/salida (I/O), algunas consideraciones de
diseo debern ser tomadas para asegurar que la operacin resulte como fu planeada.

105

Puertos de entrada/salida (I/O) bidireccionales


Cualquier instruccin que ejecute una operacin de escritura actualmente realiza una operacin
de lectura seguido de una operacin de escritura. Las instrucciones BCF y BSF, por ejemplo,
leen el registro en el CPU, ejecutan la operacin de bit y escriben el resultado nuevamente en
el registro. Algunas precauciones debern ser tomadas cuando estas instrucciones sean
aplicadas a un puerto con entradas y salidas. Por ejemplo, una operacin BSF sobre el bit5 del
puerto PORTB causar que todos los ocho bits del puerto PORTB sean ledos en el CPU.
Entonces la operacin BSF tomar lugar sobre el bit5 y el puerto PORTB ser escrito en los
latches de salida. Si otro bit del puerto PORTB fuese usado como un pin de entrada/salida
bidireccional (digamos el bit0) y ste fuese definido como entrada en ese momento, la seal de
entrada presente sobre el pin por si mismo, sera ledo por el CPU y rescrito al latch de dato
de este pin en particular, sobrescribiendo el contenido previo. Mientras que este pin
permanezca en el modo de entrada no habr ningn problema. Sin embargo, si el bit0 fuese
cambiado como de salida, el contenido del latch de dato podra ahora ser desconocido.
Leyendo el registro del puerto, leer los valores de los pines del puerto. Escribiendo en el
registro del puerto, escribir el valor en los latches del puerto. Cuando utilice las instrucciones
de lectura-modificacin-escritura (read-modify-write) (ejemplo BCF, BSF, etc.) sobre un puerto,
el valor de los pines del puerto sern ledos, la operacin deseada ser ejecutada con este
valor y entonces el valor resultante ser sobrescrito en el latch del puerto.
El ejemplo 10.9 muestra el efecto de dos instrucciones de lectura-modificacin-escritura (readmodify-write) secunciales sobre un puerto de entrada/salida (I/O).
Ejemplo 10.9

Instrucciones de lectura-modificacin-escritura sobre un puerto de


entrada/salida

Un pin configurado como una salida, nunca deber ser manejado por un dispositivo externo al
mismo tiempo con el objeto de forzar el estado de dicho pin ya que provocara una excesiva
circulacin de corriente y daara el microcontrolador.
Operaciones sucesivas sobre un puerto de entrada/salida (I/O)
La escritura en un puerto de entrada/salida (I/O) sucede al final del ciclo de instruccin,
mientras que para lectura, el dato deber ser vlido al inicio del ciclo de instruccin (figura
10.12). Por consiguiente, un especial cuidado deber ser tomado si una operacin de escritura

106

es seguida por una operacin de lectura sobre el mismo puerto de entrada/salida (I/O). La
secuencia de instrucciones debera ser tal que permitiera estabilizarse el voltaje en el pin (lo
cual depende de la carga) antes de que la siguiente instruccin de lectura del puerto sea
ejecutada. De otra manera, el estado previo de ese pin podra ser ledo por el CPU en lugar del
nuevo estado. En caso de duda, es preferible separar esas instrucciones con una instruccin
NOP o cualquier otra instruccin que no acceda el puerto de entrada/salida (I/O).
Figura 10.12

Operaciones sucesivas de entrada/salida

La figura 10.13 muestra el modelo de entrada/salida (I/O) el cual causa esta situacin. Como la
capacitancia efectiva (C) viene a ser ms grande, el tiempo de subida/bajada (rise/fall time) del
pin se incrementa. Mientras la frecuencia de operacin del microcontrolador o la capacitancia
efectiva se incrementen, entonces la posibilidad de caer en esta situacin se incrementar.
Esta capacitancia efectiva incluye los efectos de las pistas del circuito impreso.
La mejor manera de direccionar esto es agregar una resistencia en serie en el pin de
entrada/salida (I/O). Esta resistencia le permite al pin alcanzar el nivel deseado antes de la
prxima instruccin.
El uso de instrucciones NOP entre las subsecuentes instrucciones de lectura-modificacinescritura (read-modify-write) es una solucin de bajo costo, pero tiene el problema que el
nmero de instrucciones NOP es dependiente de la capacitancia C efectiva y la frecuencia del
microcontrolador.

107

Figura 10.13

Problemas de conexin de entrada/salida (I/O)

108

11 Puerto paralelo esclavo (PSP)

Algunos microcontroladores poseen un puerto paralelo esclavo (Parallel Slave Port) (PSP) de
8 bits. Este puerto es multiplexado con uno de los puertos de entrada/salida (I/O) del
microcontrolador. El puerto operar como un puerto paralelo esclavo de 8 bits o bien como
puerto de un microprocesador, cuando el bit de control PSPMODE se encuentre encendido. En
este modo, los amplificadores (buffers) de entrada sern TTL.
En modo esclavo (slave) el mdulo podr ser ledo y escrito asincrnicamente por el mundo
exterior mediante los pines de control de entrada RD y WR.
Este puerto puede acoplarse directamente al bus de datos de un microprocesador de 8 bits. El
microprocesador externo podr leer y escribir el latch del puerto como un latch de 8 bits.
Prendiendo el bit PSPMODE habilitar los pines del puerto a ser la entrada RD, la entrada WR
y la entrada CS (Chip Select).
Nota 1:

Actualmente el puerto PSP es multiplexado nicamente con los puertos


PORTD y PORTE. El puerto PSP es habilitado prendiendo el bit PSPMODE. En
este modo, el usuario deber asegurarse que los puertos PORTD y PORTE
sean configurados como puertos digitales de entrada/salida (I/O). Esto es, los
mdulos perifricos multiplexados sobre las funciones del PSP son
deshabilitados (tales como el puerto A/D).

Nota 2:

En este modo los amplificadores (buffers) de entrada de los puertos PORTD y


PORTE son TTL. Los bits de control para la operacin del puerto PSP estn
localizados en el registro TRISE.

Actualmente existen dos latches de 8 bits cada uno, uno para salida de datos (data-out)
(desde el microcontrolador PIC) y otro para la entrada de datos. El usuario escribe un dato de 8
bits en el latch de datos de salida del puerto y lee datos desde el latch del pin del puerto
(note que ambos tienen la misma direccin). En este modo, el registro TRIS es ignorado debido
a que la direccin del flujo de datos es controlada por el microprocesador externo.
La figura 11.1 muestra un diagrma de bloques del PSP.

109

Figura 11.1

Diagrma de bloques del PORTD y PORTE


(Puerto paralelo esclavo) (PSP)

Registro de control
Registro TRISE

bit 7

IBF: Bit de estado de la memoria de entrada completa (Input Buffer Full)


1 = Una palabra ha sido recibida y esperando a ser leda por el CPU
0 = Ninguna palabra ha sido recibida

bit 6

OBF: Bit de estado de la memoria de salida completa (Output Buffer Full)


1 = La memoria de salida todava contiene una palabra previamente escrita
0 = La memoria de salida ha sido leda

bit 5

IBOV: Bit de deteccin de sobre-flujo en la memoria de entrada


(Input Buffer Overflow Detect)
1 = Una escritura ocurri cuando una palabra previamente escrita no haba sido leda
(debe ser apagada por programa)

110

0 = Ningn sobre-flujo ocurri


bit 4

PSPMODE: Bit de seleccin de modo PSP


(Parallel Slave Port Mode Select)
1 = Modo Puerto Paralelo Esclavo (PSP)
0 = Modo entrada/salida (I/O) de propsito general

bit 3

No implementado: Ledo como 0

bit 2

TRISE2: Bit de control de direccin RE2


1 = Entrada (Input)
0 = Salida (Output)

bit 1

TRISE1: Bit de control de direccin RE1


1 = Entrada (Input)
0 = Salida (Output)

bit 0

TRISE0: Bit de control de direccin RE0


1 = Entrada (Input)
0 = Salida (Output)
R = Bit de lectura
W = Bit de escritura
U = Bit no implementado, ledo como 0
- n = Valor al arranque (Reset) POR

Operacin
Una escritura al puerto PSP desde un sistema externo, ocurre cuando las lneas CS y WR son
primero detectadas bajas. Cuando alguna de las dos lneas CS o WR vienen a ser altas (edge
triggered), el bit de bandera de estado de la memoria de entrada completa (Input Buffer Full)
IBF (TRISE<7>) es encendido sobre el ciclo de reloj Q4, siendo en el prximo ciclo de reloj Q2,
cuando se indique que la escritura ha sido completada. El bit de bandera de interrupcin,
PSPIF, es tambin prendido sobre el mismo ciclo de reloj Q4. El bit de bandera IBF es inhibido
de ser apagado por TCY ciclos adicionales. Si el bit de bandera IBF es apagado por leer el
latch de entrada del PORTD, sta deber ser una instruccin de lectura nicamente (es decir,
MOVF) y no as una instruccin de lectura-modificacin-escritura (read-modify-write). El bit de
bandera de estado de sobre-flujo de la memoria (buffer) de entrada, IBOV (TRISE<5>) es
prendido si una segunda operacin de escritura al puerto paralelo esclavo (PSP) es intentada
cuando el byte previo no ha sido ledo de la memoria.
Una lectura del puerto PSP desde el sistema externo ocurre cuando las lneas CS y RD son
primero detectadas bajas. El bit de bandera de estado de la memoria (buffer) de salida
completa, OBF (TRISE<6>) es apagada inmediatamente, indicando que el latch del puerto
PORTD fu ledo por el bus externo. Cuando el pin CS o el pin RD viene a ser alto (edge
triggered), el bit de bandera de interrupcin PSPIF es encendido sobre el ciclo de reloj Q4,
siendo en el prximo ciclo de reloj Q2 cuando se indique que la lectura ha sido completada. El
bit OBF permanecer bajo hasta que el dato sea escrito en el puerto PORTD por el programa
del usuario.
El bit de bandera de estado de la memoria (buffer) de entrada completa, IBF, es prendida si
una palabra recibida esta esperando a ser leda por el CPU. Una vez que el latch de entrada
del puerto es ledo, el bit IBF es apagado. El bit IBF es un bit de estado de solamente lectura.
El bit de bandera de estado de la memoria (buffer) de salida completa, OBF, es prendido si una
palabra escrita en el latch del puerto est esperando a ser ledo por el bus externo. Una vez
que el latch del puerto PORTD es ledo por el microprocesador, el bit OBF es apagado. El bit
de bandera de estado de sobre-flujo de la memoria (buffer) de entrada, IBOV, es prendido si

111

una segunda escritura al puerto del microprocesador es intentada cuando la palabra previa no
ha sido leda por el CPU (la primera palabra es retenida en la memoria (buffer)).
Cuando este puerto no se encuentre en el modo de puerto paralelo esclavo (PSP), los bits IBF
y OBF se mantendrn apagados. Sin embargo, si el bit IBOV fu prendido previamente, ste
deber ser apagado por programa.
Una interrupcin ser generada y guardada (latched) en el bit de bandera PSPIF cuando una
operacin de lectura o escritura sea completada. El bit de bandera de interrupcin PSPIF
deber ser apagado por el programa del usuario y las interrupciones podrn ser deshabilitadas
apagando el bit de habilitacin de interrupcin PSPIE.
Tabla 11.1

Nota:

Funciones del puerto PORTE

El puerto PSP puede tener otras funciones multiplexadas en los mismos pines. Para
que el puerto PSP opere, estos pines debern ser configurados como entradas/salidas
(I/O) digitales.

Operacin en modo de reposo (sleep mode)


Cuando el microcontrolador se encuentre en modo de reposo (sleep mode), el microprocesador
podr todava leer y escribir en el puerto paralelo esclavo (PSP). Estas acciones prendern el
bit PSPIF. Si las interrupciones de PSP son habilitadas, esto despertar (wake-up) al
microcontrolador del modo de reposo (sleep mode) tal que el latch de datos del puerto PSP
pueda ser ledo o escrito con el prximo valor del microprocesador.
Efectos de un arranque (Reset)
Despus de cualquier arranque (Reset) el puerto PSP ser deshabilitado y los puertos PORTD
y PORTE sern forzados a su modo de default.
Formas de onda del puerto PSP
La figura 11.2 muestra las formas de onda para una escritura desde el microprocesador hacia
el puerto PSP, mientras que la figura 11.3 muestra las formas de onda para una lectura del
puerto PSP por medio del microprocesador.

112

Figura 11.2

Figura 11.3

Formas de onda de la escritura en el puerto PSP

Formas de onda de la lectura del puerto PSP

113

114

12

Temporizador Timer0

El mdulo del temporizador Timer0 tiene las siguientes caractersticas:

Temporizador/Contador (Timer/Counter) de 8 bits


Puede ser escrito y ledo
Pre-escalador de 8 bits programable por programa
Fuente de reloj seleccionable a ser externa o interna
Interrupcin por sobre-flujo de FFh a 00h
Seleccin del flanco (edge) para el reloj externo

La figura 12.1 muestra un diagrma de bloques simplificado del mdulo del temporizador
Timer0.
Figura 12.1

Diagrma de bloques del temporizador Timer0

Registro de control
El registro OPTION_REG es un registro de lectura y escritura el cual contiene varios bits de
control para configurar el pre-escalador TMR0/WDT, la interrupcin externa INT, el
temporizador TMR0 y las resistencias de pull-up del puerto PORTB.
Nota:

Para lograr una asignacin del pre-escalador de 1:1 para el registro TMR0, asigne el
pre-escalador al temporizador de guardia (Watchdog Timer) (WDT).
Registro OPTION_REG

115

(1)

bit 7

RBPU : Bit de habilitacin de las resistencias de pull-up (Weak Pull-up Enable)


1 = Las resistencia de pull-up son deshabilitadas
0 = Las resistencia de pull-up son habilitadas mediante valores individuales del latch

bit 6

INTEDG: Bit de seleccin del flanco de interrupcin (Interrupt Edge Select)


1 = Interrupcin con el flanco de subida (rising edge) del pin INT
0 = Interrupcin con el flanco de bajada (falling edge) del pin INT

bit 5

T0CS: Bit de seleccin de la fuente del reloj de TMR0 (TMR0 Clock Source Select)
1 = Transicin sobre el pin T0CKI
0 = Reloj interno del ciclo de instruccin (CLKOUT)

bit 4

T0SE: Bit de seleccin del flanco de la fuente de TMR0 (TMR0 Source Edge Select)
1 = Incremento en la transicin de alto-a-bajo en el pin T0CKI
0 = Incremento en la transicin de bajo-a-alto en el pin T0CKI

bit 3

PSA: Bit de asignacin del pre-escalador (Prescaler Assignment)


1 = Pre-escalador asignado a WDT (Watchdog Timer)
0 = Pre-escalador asignado al mdulo Timer0

bit 2:0 PS2:PS0: Bits de seleccin de la relacin del pre-escalador (Prescaler Rate Select)

R = Bit de lectura
U = Bit no implementado, ledo como 0
Nota 1:

W = Bit de escritura
- n = Valor al arranque (Reset) POR

Algunos modelos llaman a este bit GPPU. Los modelos que tienen el bit RBPU,
tienen las resistencias de pull-up en el puerto PORTB, mientras que los
modelos que tienen el bit GPPU tienen las resistencias de pull-up en el puerto
GPIO.

Operacin
El modo temporizador (Timer) es seleccionado apagando el bit T0CS (OPTION<5>). En el
modo temporizador (Timer), el temporizador Timer0 se incrementar cada ciclo de instruccin
(sin pre-escalador). Si el registro TMR0 es escrito, el incremento es inhibido por los siguientes
dos ciclos de instruccin (figura 12.2 y figura 12.3). El usuario podr escribir un valor ajustado
en el registro TMR0.
El modo contador (Counter) es seleccionado prendiendo el bit T0CS (OPTION<5>). En el modo
contador (Counter), el temporizador Timer0 se incrementar con cada flanco de subida (rising
edge) o de bajada (falling edge) del pin T0CKI. El flanco es determinado por el bit T0SE

116

(OPTION<4>). Apagando el bit T0SE se seleccionar el flanco de subida (rising edge). Las
restricciones sobre la entrada del reloj externo sern discutidas ms adelante.
El pre-escalador es mutuamente exclusivo compartido entre el mdulo del temporizador Timer0
y el temporizador de guardia (Watchdog Timer) WDT. La asignacin del pre-escalador es
controlada por programa mediante el bit de control PSA (OPTION<3>). Apagando el bit PSA el
pre-escalador ser asignado al mdulo Timer0. El pre-escalador no puede ser ledo ni escrito.
Cuando el pre-escalador es asignado al mdulo Timr0, los valores de pre-escala de 1:2, 1:4,...,
1:256 son seleccionables. La seccin pre-escalador del temporizador TMR0 detalla la
operacin del pre-escalador.
Cualquier escritura al registro TMR0 causar una inhibicin de dos ciclos de instruccin (2TCY).
Esto es, despus de que el registro TMR0 ha sido escrito con el nuevo valor, TMR0 no se
incrementar sino hasta el tercer ciclo de instruccin ms tarde (figura 12.2). Cuando el preescalador es asignado al mdulo Timer0, cualquier escritura al registro TMR0 inmediatamente
actualizar el registro TMR0 y borrar el pre-escalador. El incrementar del mdulo Timer0
(TMR0 y pre-escalador) tambin ser inhibido por dos ciclos de instruccin (TCY). As, si el preescalador es configurado como 2, entonces despus de una escritura al registro TMR0, este no
se incrementar sino hasta 4 ciclos de Timer0 (figura 12.3). Despus de eso, TMR0 se
incrementar cada nmero de ciclos de reloj (clocks) del pre-escalador ms tarde.
Figura 12.2

Tiempos de Timer0: Reloj interno/sin pre-escalador

Figura 12.3

Tiempos de Timer0: Reloj interno/pre-escala 1:2

Interrupcin del temporizador TMR0


La interrupcin del temporizador TMR0 es generada cuando el registro TMR0 registre un
sobre-flujo de FFh a 00h. Este sobre-flujo prender el bit T0IF (INTCON<2>). La interrupcin
podr ser enmascarada (masked) apagando el bit T0IE (INTCON<5>). El bit T0IF deber ser

117

apagado por programa en la rutina de servicio a interrupcin del mdulo Timer0 antes de volver
a habilitar esta interrupcin. La interrupcin del temporizador TMR0 no podr despertar al
procesador del estado de reposo (sleep) debido a que este temporizador se encontrar
apagado durante este estado (sleep). Ver la figura 12.4 para los tiempos de interrupcin del
mdulo Timer0.
Figura 12.4

Tiempos de interrupcin del temporizador TMR0

Usando el mdulo Timer0 con un reloj externo


Cuando es usada una entrada de reloj externo para el mdulo Timer0, este ltimo deber de
cubrir ciertos requerimientos de acuerdo a la informacin detallada en la seccin siguiente.
Estos requerimientos aseguran que el reloj externo pueda ser sincronizado con el reloj de fase
interno (TOSC). Tambin, existe un retardo al incrementarse el mdulo Timer0 despus de la
sincronizacin.
Sincronizacin del reloj externo
Cuando el pre-escalador no es usado, la entrada del reloj externo es la misma que la salida del
pre-escalador. La sincronizacin de la entrada T0CKI con el reloj de fase interno es logrado
mediante el muestreo de la salida del pre-escalador en los ciclos Q2 y Q4 del reloj de fase
interno (figura 12.5). Por consiguiente, es necesario que T0CKI est en alto al menos 2 TOSC (y
un pequeo retardo RC de 20 ns) y bajo al menos 2 TOSC (y un pequeo retardo RC de 20 ns).
Cuando el pre-escalador es usado, la entrada del reloj externo es dividida por un pre-escalador
del tipo contador asncrono (asynchronous ripple-counter) tal que la salida del pre-escalador
sea simtrica. Para que el reloj externo encuentre los requerimientos de muestreo, el contador
deber ser tomado en cuenta. Por consiguiente, es necesario que la entrada T0CKI tenga un
periodo de por lo menos 4 TOSC (y un pequeo retardo RC de 40 ns) dividido por el valor del

118

pre-escalador. El nico requerimiento en el tiempo alto y bajo de T0CKI es que stos no violen
el ancho del pulso mnimo de 10 ns.
Retardo al incrementar TMR0
Debido a que la salida del pre-escalador es sincronizada con el reloj interno, existir un
pequeo retardo desde el tiempo en que el flanco (edge) del reloj externo ocurre hasta el
tiempo en que el mdulo Timer0 sea incrementado. La figura 12.5 muestra este retardo.
Figura 12.5

Tiempos del mdulo Timer0 con reloj externo

Pre-escalador del temporizador TMR0


Un contador de 8 bits es disponible como un pre-escalador para el mdulo Timer0, o como un
post-escalador para el temporizador de guardia (Watchdog Timer) WDT (ver figura 12.6). Por
simplicidad, este contador esta siendo referido como un pre-escalador en la descripcin del
mdulo Timer0. De esta manera, una asignacin de un pre-escalador para el mdulo Timer0
significa que no habr un post-escalador para el temporizador de guardia (Watchdog Timer)
WDT y viceversa.
Nota:

Existe solamente un pre-escalador disponible el cual es mutuamente exclusivo al


compartirse entre el mdulo Timer0 y el temporizador de guardia (Watchdog Timer)
WDT.

Los bits PSA y PS2:PS0 (OPTION<3:0>) determinan la asignacin del pre-escalador y la


relacin (ratio) del pre-escalador.
Cuando sea asignado al mdulo Timer0, todas las instrucciones que escriban en el registro
TMR0 (esto es, CLRF TMR0, MOVWF TMR0, BSF TMR0, etc.) borrarn el pre-escalador.
Cuando sea asignado al WDT, la instruccin CLRWDT borrar el pre-escalador junto con el
temporizador de guardia (Watchdog Timer) WDT. El pre-escalador no puede ser ledo ni
escrito.

119

Figura 12.6

Diagrma de bloques del pre-escalador del Timer0/WDT

Cambiando la asignacin del pre-escalador


La asignacin del pre-escalador es totalmente controlable por programa, es decir, puede ser
cambiada al vuelo durante la ejecucin del programa.
Nota:

Para prevenir un indeseado arranque (Reset) del microcontrolador, la siguiente


secuencia de instrucciones (mostrada en el ejemplo 12.1) deber ser ejecutada
cuando cambie la asignacin del pre-escalador del mdulo Timer0 al temporizador de
guardia WDT. Esta secuencia deber ser seguida aun si el temporizador WDT se
encuentra deshabilitado.

En el ejemplo 12.1, la primera modificacin del registro OPTION_REG no necesitar ser


incluida si el pre-escalador final deseado es diferente a 1:1, ya que el valor final ser puesto en
la ltima modificacin del registro OPTION_REG.

120

Ejemplo 12.1 Cambio del pre-escalador (Timer0

WDT)

Para cambiar el pre-escalador desde el temporizador de guardia WDT al temporizador del


mdulo Timer0 utilice la secuencia mostrada en el ejemplo 12.2.
Ejemplo 12.2 Cambio del pre-escalador (WDT Timer0)

Inicializacin
Debido a que el mdulo Timer0 tiene una fuente de reloj programable por programa, existen
dos ejemplos que muestran la inicializacin del Timer0 con cada fuente. El ejemplo 12.3
muestra la inicializacin para la fuente de reloj interna (modo temporizador) (timer mode),
mientras que el ejemplo 12.4 muestra la inicializacin para la fuente de reloj externa (modo
contador) (counter mode).
Ejemplo 12.3 Inicializacin del Timer0 (fuente de reloj interna)

121

Ejemplo 12.4 Inicializacin del Timer0 (fuente de reloj externa)

122

13

Temporizador Timer1

El mdulo Timer1 es un temporizador/contador (timer/counter) de 16 bits integrado por dos


registros de 8 bits cada uno (TMR1H y TMR1L) los cuales son de lectura y escritura. El par de
registros TMR1 (TMR1H:TMR1L) se incrementarn de 0000h hasta FFFFh y se reciclarn a
0000h. La interrupcin del Timer1, si es que se encuentra habilitada, ser generada cuando
exista una condicin de sobre-flujo, la cual ser registrada (latched) en el bit de bandera de
interrupcin TMR1IF. Esta interrupcin podr ser habilitada/deshabilitada mediante el
prender/apagar el bit de habilitacin de interrupcin TMR1IE.
El mdulo Timer1 podr operar en uno de tres modos:

Como un temporizador (timer) sincrnico


Como un contador (counter) sincrnico
Como un contador (counter) asncrono

El modo de operacin es determinado por el bit de seleccin del reloj, TMR1CS (T1CON<1>) y
el bit de sincronizacin T1SYNC (figura 13.1).
En el modo temporizador (timer), el mdulo Timer1 se incrementar cada ciclo de instruccin
mientras que en el modo contador (counter), ste se incrementar cada flanco de subida (rising
edge) del reloj externo de entrada sobre el pin T1CKI.
El mdulo Timer1 podr ser prendido y apagado con el bit de control TMR1ON (T1CON<0>).
El mdulo Timer1 tambin posee una entrada de arranque (reset) interna, el cual podr ser
generado por un mdulo CPP.
El mdulo Timer1 tiene la capacidad de operar un cristal externo. Cuando el mdulo Timer1
sea habilitado (prendiendo el bit T1OSCEN), los pines T1OSI y T1OSO vendrn a ser entradas.
Es decir, los valores correspondientes a los bits TRIS sern ignorados.

123

Figura 13.1

Diagrma de bloques del mdulo Timer1

Registro de control del mdulo Timer1


Registro T1CON

bit 7:6 No implementados: Ledos como 0


bit 5:4 T1CKPS1: T1CKPS0: Bits de seleccin de entrada de reloj del pre-escalador Timer1
(Timer1 Input Clock Prescale Select)
11 = 1:8 valor del pre-escalador
10 = 1:4 valor del pre-escalador
01 = 1:2 valor del pre-escalador
00 = 1:1 valor del pre-escalador
bit 3

T1OSCEN: Bit de habilitacin del oscilador del Timer1 (Timer1 Oscillator Enable)
1 = El oscilador es habilitado
0 = El oscilador es deshabilitado. El inversor y la resistencia del oscilador son
deshabilitados para eliminar el consumo de potencia.

bit 2

T1SYNC: Bit de seleccin de sincronizacin del reloj externo de entrada de Timer1


(Timer1 External Clock Input Synchronization Select)
Cuando TMR1CS = 1:
1 = No sincronizar el reloj externo de entrada
0 = Sincronizar el reloj externo de entrada
Cuando TMR1CS = 0:

124

Estos bits son ignorados. El mdulo Timer1 utiliza el reloj interno cuando TMR1CS=0
bit 1

TMR1CS: Bit de seleccin de la fuente de reloj Timer1 (Timer1 Clock Source Select)
1 = Reloj externo del pin T1OSO/T1CKI (con el flanco de subida (rising edge))
0 = Reloj interno (Fosc/4)

bit 0

TMR1ON: Bit de encendido del Timer1


1 = Habilita el mdulo Timer1
0 = Apaga el mdulo Timer1
R = Bit de lectura
W = Bit de escritura
U = Bit no implementado, ledo como 0

- n = Valor al arranque (Reset) POR

Operacin del Timer1 en modo temporizador (Timer)


El modo temporizador (timer) es seleccionado apagando el bit TMR1CS (T1CON<1>). En este
modo, el reloj de entrada al temporizador es FOSC/4. El bit de control de sincronizacin T1SYNC
(T1CON<2>), no tendr efecto debido a que el reloj interno se encuentra siempre sincronizado.
Operacin del Timer1 en modo de contador (counter) sincronizado
El modo contador (counter) es seleccionado prendiendo el bit TMR1CS (T1CON<1>). En este
modo el temporizador se incrementar en cada flanco de subida (rising edge) del reloj de
entrada sobre el pin T1OSI cuando el bit de habilitacin del oscilador, T1OSCEN, se encuentre
encendido, o sobre el pin T1OSO/T1CKI cuando el bit T1OSCEN se encuentre apagado.
Si el bit T1SYNC es apagado, entonces el reloj externo de entrada ser sincronizado con la
fase del reloj interno. La sincronizacin es hecha despus de la etapa del pre-escalador. El preescalador es un contador asncrono (asynchronous ripple-counter).
En esta configuracin, durante el modo de reposo (sleep), el mdulo Timer1 no incrementar
an si el reloj externo se encuentre presente, debido a que el circuito de sincronizacin estar
apagado. El pre-escalador sin embargo, continuar incrementndose.
Tiempos del reloj externo de entrada para el modo contador sincronizado
Cuando un reloj externo de entrada es utilizado en el mdulo Timer1 en modo contador
sincronizado, debern cumplirse con ciertos requerimientos debido a la sincronizacin de la
fase del reloj interno (TOSC). Tambin existe un retardo al incrementarse el registro TMR1
despus de la sincronizacin.
Cuando el pre-escalador es 1:1, el reloj externo de entrada es el mismo al de la salida del preescalador. La sincronizacin de T1CKI con la fase del reloj interno es lograda mediante el
muestreo de la salida del pre-escalador sobre periodos de reloj TOSC alternos de la fase del reloj
interno. Por consiguiente, ser necesario que el pin T1CKI se encuentre alto al menos 2 TOSC (y
un pequeo retardo RC) y bajo al menos 2 TOSC (y un pequeo retardo RC).
Cuando un pre-escalador diferente de 1:1 sea utilizado, el reloj externo de entrada ser dividido
mediante el contador asncrono (asynchronous ripple counter) del pre-escalador, tal que la
salida del pre-escalador sea simtrico. Con el objeto de que el reloj externo encuentre los
requerimientos de muestreo, el contador deber ser tomado en cuenta. Por consiguiente, ser

125

necesario para el pin T1CKI que tenga un periodo de al menos 4 TOSC (y un pequeo retardo
RC) dividido por el valor del pre-escalador. Otro requerimiento sobre el tiempo en alto y en bajo
en el pin T1CKI es que stos no violen el ancho del pulso mnimo requerido. (Ver
especificaciones tcnicas del modelo de inters).
Operacin del Timer1 en el modo contador asncrono
Si el bit T1SYNC (T1CON<2>) es encendido, el reloj externo de entrada no se sincronizar. El
temporizador continuar incrementndose asincrnicamente a la fase del reloj interno. El
temporizador continuar corriendo durante el modo de reposo (sleep) y podr generar una
interrupcin cuando sea detectado un sobre-flujo el cual despertar al microcontrolador. Sin
embargo, algunas precauciones especiales en la programacin al leer/escribir el temporizador
debern ser tomadas. Debido a que el contador puede operar en el modo de reposo (sleep), el
mdulo Timer1 podr ser utilizado para implementar un verdadero reloj de tiempo real.
En el modo de contador asncrono, el mdulo Timer1 no podr ser usado como una base de
tiempo para operaciones de captura y comparacin.
Tiempos del reloj externo de entrada con reloj no sincronizado
Si el bit de control T1SYNC es prendido, el temporizador se incrementar completamente
asncrono. El reloj de entrada deber encontrar un cierto tiempo en alto mnimo y bajo mnimo
requeridos. Ver hoja de especificaciones tcnicas (datasheet) del modelo en cuestin.
Leyendo y escribiendo el mdulo Timer1 en el modo contador asncrono
Leer los registros TMR1H y TMR1L mientras el temporizador se encuentra corriendo desde un
reloj asncrono externo, garantizar una lectura vlida (teniendo cuidado en el hardware). Sin
embargo, el usuario deber recordar que leer el temporizador de 16 bits en dos valores de 8
bits implica ciertos problemas debido a que el temporizador podr tener una condicin de
sobre-flujo entre las lecturas.
Para escribir en estos registros es recomendado que el usuario simplemente pare el
temporizador y escriba el valor deseado. Una contencin de escritura podra ocurrir si se
escribiera en los registros del temporizador mientras se estn incrementando. Esto podra
producir un valor impredecible en los registros del temporizador.
Leer el valor de 16 bits requerir de algn cuidado debido a que se requerirn dos lecturas
separadas para leer los 16 bits. El ejemplo 13.1 muestra porque esto no es una lectura directa
del registro de 16 bits.
Ejemplo 13.1 Problemas al leer un registro de 16 bits

126

El ejemplo 13.2 muestra una rutina para leer el valor del temporizador de 16 bits
experimentando los problemas mostrados en el ejemplo 13.1. Esto es til si el temporizador no
puede ser parado.
Ejemplo 13.2

Leyendo un temporizador de 16 bits corriendo

Para escribir un valor de 16 bits en el registro TMR1 es directo. Primero el registro TMR1L es
borrado para asegurar que pueda haber muchos ciclos del oscilador del Timer1 antes de que
exista un enrollamiento (rollover) en el registro TMR1H. El registro TMR1H es entonces
cargado y finalmente el registro TMR1L es cargado. El ejemplo 13.3 muestra esto:
Ejemplo 13.3

Escribiendo un temporizador de 16 bits corriendo

Oscilador del mdulo Timer1


Un circuito oscilador de cristal es construido entre los pines T1OSI (entrada) y T1OSO
(amplificador de salida). Este es habilitado prendiendo el bit de control T1OSCEN (T1CON<3>).
El oscilador es de baja potencia si opera con una frecuencia de 200 KHz. Este oscilador
continuar corriendo an durante el modo de reposo (sleep). Una propuesta inicial sera el
utilizar un cristal de 32 KHz, la cual es una frecuencia ideal para mantener un reloj de tiempo
real. La tabla 13.1 muestra la seleccin de los capacitores para el oscilador del mdulo Timer1.

127

El oscilador del Timer1 es idntico al oscilador LP. El usuario deber proporcionar un tiempo
de retardo por programa para asegurar el correcto arranque (start-up) del oscilador.
Nota:

Esto permitir que el contador opere (se incremente) cuando el microcontrolador se


encuentre en modo de reposo (sleep), lo cual a su vez permitir que el Timer1 sea
usado como un reloj de tiempo real.
Tabla 13.1

Seleccin de los capacitores para el oscilador del Timer1

Nota 1: Mayores capacitancias incrementan la estabilidad del oscilador pero


tambin incrementan el tiempo de arranque (start-up).
2: Debido a que cada cristal/resonador tienen sus propias caractersticas,
el usuario deber consultar al fabricante para la seleccin de las
componentes externas.
Aplicaciones tpicas
Esta caracterstica es tpicamente usada en aplicaciones donde sea necesario mantener el
tiempo real, pero tambin es deseable tener el menor consumo de potencia posible. El
oscilador del Timer1 le permite al microcontrolador ponerlo en modo de reposo (sleep),
mientras el temporizador continua incrementndose. Cuando el Timer1 detecte un sobre-flujo,
la interrupcin despertar al microcontrolador para que ste pueda actualizar los registros.
Figura 13.2

Aplicaciones del mdulo Timer1

128

Operacin en modo de reposo (Sleep)


Cuando el mdulo Timer1 sea configurado para operar asincrnicamente, los registros TMR1
continuarn incrementndose cada ciclo de reloj del temporizador (o un nmero de ciclos
mltiplos al valor del pre-escalador). Cuando los registros del temporizador TMR1 causen una
condicin de sobre-flujo, el bit TMR1IF se encender, y si se encuentran habilitadas, una
interrupcin ser generada, despertando al microcontrolador de su estado de reposo.
El oscilador del mdulo Timer1 agregar una corriente delta, debido a la operacin de este
circuito. Esto es, la corriente de potencia baja (power-down) que consiste nicamente de la
corriente de fuga (leakage) del dispositivo, crecer debido a la corriente activa del oscilador y
otros circuitos del Timer1.
Inicializando el Timer1 usando una salida de disparo del mdulo CPP
Si un mdulo CPP es configurado en modo comparador para generar un evento especial de
disparo (special event trigger) (CPP1M3:CPP1M0 = 1011), esta seal inicializar (reset) el
Timer1.
Nota:

El evento especial de disparo del mdulo CPP no enciende el bit de bandera de


interrupcin TMR1IF.

El Timer1 deber ser configurado como temporizador (timer) o en modo contador sincronizado
para tomar ventaja de la caracterstica de evento especial de disparo. Si el Timer1 se
encontrar corriendo en el modo contador asncrono, esta operacin de inicializacin pudiera
no trabajar, por lo que no debiera ser usado.
En el evento que una escritura al Timer1 coincidiera con un evento especial de disparo desde
el mdulo CPP, la operacin de escritura tomar precedencia.
En este modo de operacin, el par de registros CCPRxH:CCPRxL efectivamente vendr a ser
el registro del periodo para el mdulo Timer1.
Inicializando el par de registros (TMR1H:TMR1L)
Los registros no sern inicializados en un arranque (reset) tipo POR (Power-On Reset) o
cualquier otro tipo, sino nicamente por el evento especial de disparo.
El registro T1CON es inicializado a 00h en el arranque (reset) tipo POR o tipo Brown-out
(BOR). En cualquier otro tipo de arranque (reset) el registro no ser afectado.
El pre-escalador del mdulo Timer1
El contador del pre-escalador ser borrado cuando sean escritos los registros TMR1H y
TMR1L.

129

Tabla 13.2

Registros asociados con el Timer1 como un temporizador/contador


(timer/counter)

x = desconocido
u = sin cambio - = no implementado, ledo como 0
Celdas sombreadas no son usadas por el mdulo Timer1.
Nota 1: La posicin de este bit depende del modelo.
2: Estos bits pueden tambin ser nombrados GPIE y GPIF.
Inicializacin
Debido a que el mdulo Timer1 tiene una fuente de reloj programable por programa, se
presentan 3 ejemplos que muestran la inicializacin de cada modo. El ejemplo 13.4 muestra la
inicializacin para la fuente de reloj interna, el ejemplo 13.5 muestra la inicializacin para la
fuente de reloj externa y el ejemplo 13.6 muestra la inicializacin para el modo del oscilador
externo.
Ejemplo 13.4

Inicializacin del mdulo Timer1 (Fuente de reloj interno)

130

Ejemplo 13.5

Inicializacin del mdulo Timer1 (Fuente de reloj externo)

Ejemplo 13.6

Inicializacin del mdulo Timer1


(Fuente de reloj: oscilador externo)

131

132

14

Temporizador Timer2

El mdulo Timer2 es un temporizador (timer) de 8 bits con un pre-escalador, un post-escalador


y un registro de periodo. Utilizando el pre-escalador y post-escalador a su mxima capacidad,
el tiempo de sobre-flujo sera igual al de un temporizador de 16 bits.
El timer2 es la base de tiempo para el PWM (Pulse Width Modulation) cuando el o los mdulos
CPP sean usados en el modo PWM.
La figura 14.1 muestra un diagrma de bloques del mdulo Timer2. El post-escalador cuenta el
nmero de veces que el registro TMR2 coincide con el registro PR2. Esto puede ser til para
reducir el tamao de la rutina de servicio de interrupcin y as aumentar el desempeo del
CPU.
Figura 14.1

Diagrma de bloques del mdulo Timer2

Registro de control del Timer2


Registro T2CON

bit 7

Bit no implementado: Ledo como 0

133

bit 6:3 TOUTPS3:TOUTPS0: Bits de seleccin de post-escala para la salida del Timer2
(Timer2 Output Postscale Select)
0000 = 1:1 Post-escala
0001 = 1:2 Post-escala

:
:

1111 = 1:16 Post-escala

bit 2

TMR2ON: Bit de encendido del Timer2 (Timer2 On)


1 = Timer2 encendido
0 = Timer2 apagado

bit 1:0 T2CKPS1:T2CKPS0: Bits de seleccin del reloj pre-escalador del Timer2
(Timer2 Clock Prescale Select)
00 = Pre-escalador es 1
01 = Pre-escalador es 4
1x = Pre-escalador es 16
R = Bit de lectura
W = Bit de escritura
U = Bit no implementado, ledo como 0

- n = Valor al arranque (Reset) POR

Fuente de reloj del mdulo Timer2


El mdulo Timer2 tiene una entrada de reloj, el reloj del microcontrolador (FOSC/4). Una opcin
de pre-escala 1:1, 1:2 o 1:16 es seleccionable por programa mediante los bits de control
T2CKPS1:T2CKPS0 (T2CON<1:0>).
Registro TMR2 y registro de periodo
El registro TMR2 es de lectura y escritura y es borrado con todo tipo de arranques (Resets). El
temporizador Timer2 se incrementar desde 00h hasta que coincida con el registro PR2 y
entonces se inicializar nuevamente a 00h en el prximo ciclo de incremento. El registro PR2
es de lectura y escritura.
El temporizador TMR2 ser borrado cuando una condicin de arranque (Reset) del tipo WDT,
POR, MCLR o BOR ocurra, mientras que el registro PR2 ser escrito con su valor.
El Mdulo Timer2 podr ser apagado (shut off) (deshabilitado para incrementarse) apagando el
bit de control TMR2ON (T2CON<2>). Esto minimiza el consumo de potencia del mdulo.
Salida de coincidencia (match output ) del registro TMR2
La salida de coincidencia o equivalencia (match output) del registro TMR2 va a dos fuentes:
1. Post-escalador del mdulo Timer2 (Timer2 Postscaler)
2. Reloj de entrada del mdulo SSP (SSP Clock Input)
Existen cuatro bits para seleccionar el post-escalador, desde 1:1 hasta 1:16 inclusive. Una vez
que el post-escalador cause un sobre-flujo, el bit de bandera de interrupcin del temporizador
TMR2IF ser encendido para indicar esta condicin en el mdulo Timer2. Esto es til para
reducir el cdigo de la rutina de servicio a interrupcin del Timer2 ya que nicamente se
ejecutar una vez cada determinado nmero de coincidencias (# of matches) del postescalador.

134

La salida de coincidencia (match output) del temporizador TMR2 ser tambin dirigida al
mdulo del puerto serial sincrnico (Synchronous Serial Port), la cual podr ser seleccionada
por programa como una fuente de reloj para el reloj de corrimiento (shift clock).
Borrando el pre-escalador y el post-escalador del mdulo Timer2
Los contadores del pre-escalador y post-escalador sern borrados (cleared) cuando uno de los
eventos siguientes ocurra:

Una escritura al registro TMR2


Una escritura al registro T2CON
Nota: Cuando T2CON es escrito TMR2 no es borrado.

Cualquier arranque (reset) (POR, MCLR, WDT, BOR o PER)

Operacin de reposo (Sleep Operation)


Durante el modo de reposo (sleep), el temporizador TMR2 no se incrementar. El preescalador retendr su ltimo conteo, listo para concluir su operacin despus de que el
microcontrolador sea despertado (wake-up) de su estado de reposo.
Tabla 14.1

Registros asociados con el mdulo Timer2

Inicializacin
El ejemplo 14.1 muestra como inicializar el mdulo Timer2, incluyendo especificar el preescalador y el post-escalador.

135

Ejemplo 14.1 Inicializacin del Timer2

136

15 Compara/Captura/PWM (CCP)

Cada mdulo CCP (Compare/Capture/PWM) contiene un registro de 16 bits el cual podr


operar como un registro de captura de 16 bits, como un registro de comparacin de 16 bits o
como un registro de ciclo de trabajo PWM de 10 bits maestro/esclavo (10-bit PWM
master/slave Duty Cycle register). Los mdulos CCP son idnticos en su operacin con
excepcin de la operacin de disparo de evento especial (special event trigger).
Cada mdulo CCP tiene tres registros. Mltiples mdulos CCP podrn existir sobre un solo
microcontrolador. En este captulo usaremos nombres genricos para los registros del CCP, los
cuales son mostrados en la tabla 15.1.
Tabla 15.1

Nomenclatura del CCP especfico a genrico

La tabla 15.2 muestra los recursos del mdulo CCP, en cada uno de sus modos mientras que
la tabla 15.3 muestra las interacciones entre los mdulos CCP, donde CCPx es un mdulo
CCP y CCPy es otro mdulo CCP.
Tabla 15.2 Modo CCP Recursos del temporizador (timer)

137

Tabla 15.3

Interaccin de dos mdulos CCP

Registro de control CCPxCON

bit 7:6 Bit no implementado: Ledo como 0


bit 5:4 DCxB1:DCxB0: Bit 1 y bit 0 del ciclo de trabajo de PWM (PWM Duty Cycle)
Modo captura:
No usado
Modo compara:
No usado
Modo PWM:
Estos bits son los bits menos significantes (bit1:bit0) de los 10 bits del ciclo de
trabajo (Duty Cycle). Los 8 bits ms significantes (DCx9:DCx2) del ciclo de
trabajo son encontrados en el registro CCPRxL.
bit 3:0 CCPxM3:CCPxM0: Bits de seleccin de modo de los CCPx (CCPx Mode Select)
0000 = Captura/Compara/PWM apagado (Inicia (Reset) el mdulo CCPx)
0100 = Modo Captura, cada flanco de bajada (falling edge)
0101 = Modo Captura, cada flanco de subida (rising edge)
0110 = Modo Captura, cada 4 flanco de subida (rising edge)
0111 = Modo Captura, cada 16 flanco de subida (rising edge)
1000 = Modo Compara
Inicializa el pin CCP bajo, con coincidencia en comparacin (compare match)
forzar el pin CCP alto (el bit CCPIF es encendido)
1001 = Modo Compara
Inicializa el pin CCP alto, con coincidencia en comparacin (compare match)
forzar el pin CCP bajo (el bit CCPIF es encendido)
1010 = Modo Compara
Genera una interrupcin con coincidencia en comparacin (compare match) No
afectar el pin CCP (el bit CCPIF es encendido)
1011 = Modo Compara
Genera un disparo de evento especial (Trigger Special Event) (el bit CCPIF es
encendido)
11xx = Modo PWM
R = Bit de lectura

W = Bit de escritura

138

U = Bit no implementado, ledo como 0

- n = Valor al arranque (Reset) POR

Modo Captura
En modo captura, los registros CCPRxH:CCPRxL capturar el valor de 16 bits del registro
TMR1 cuando un evento ocurra sobre el pin CCPx. Un evento es definido como:

Cada flanco de bajada (falling edge)


Cada flanco de subida (rising edge)
Cada 4 flanco de subida (rising edge)
Cada 16 flanco de subida (rising edge)

Un evento es seleccionado mediante los bits de control CCPxM3:CCPxM0 (CCPxCON<3:0>).


Cuando una captura es hecha, el bit de bandera de interrupcin, CCPxIF, es encendido, y
deber ser apagado por programa. Si otra captura ocurriera antes de ser ledo el valor del
registro CCPRx, el valor previamente capturado se perder.
Nota:

El Timer1 deber estar corriendo en modo temporizador (timer) o en modo contador


sincronizado para el mdulo CCP para utilizar la caracterstica de captura. En el modo
contador asncrono, la operacin de captura pudiera no trabajar.

Como se podr observar en la figura 15.1, la operacin de captura no inicializa (reset) el


registro TMR1 de 16 bits. Esto hace que el Timer1 pueda tambin ser utilizado como la base de
tiempo para otras operaciones. El tiempo entre dos capturas podr ser calculado fcilmente
como la diferencia entre el valor de la segunda y la primera captura. Cuando el Timer1 causa
una condicin de sobre-flujo (overflow), el bit TMR1IF se encender y si las interrupciones se
encuentran habilitadas, una interrupcin ocurrir, permitiendo que la base de tiempo pueda ser
extendida ms all de los 16 bits.
Configuracin de los pines del mdulo CCP
En modo captura, el pin CCPx podra ser configurado como una entrada mediante el encendido
del bit TRIS.
Nota:

Si el pin CCPx fuese configurado como una salida, una operacin de escritura al puerto
podra causar una condicin de captura.

139

Figura 15.1

Diagrma de bloques de la operacin en modo captura

El pre-escalador podr ser usado para conseguir una resolucin promedio muy fina sobre una
frecuencia de entrada constante. Por ejemplo, si nosotros tuviramos una frecuencia de
entrada estable y pusiramos el pre-escalador en 1:16, entonces el error total para esos 16
periodos sera 1 TCY. Esto nos da una resolucin efectiva de TCY/16, lo cual implica que a 20
MHz sera de 12.5 ns. Esta tcnica es nicamente vlida donde la frecuencia de entrada es
estable sobre las 16 muestras. Si no usramos el pre-escalador (es decir, 1:1), cada muestra
tendra una resolucin de TCY.
Cambiando entre modos de captura
Cuando el modo de captura es cambiado, una interrupcin de captura podra ser generada. Por
lo tanto, el usuario deber mantener el bit de habilitacin de interrupcin CCPxIE apagado para
deshabilitar las interrupciones y deber apagar el bit de bandera CCPxIF despus de cualquier
cambio en el modo de operacin.
Pre-escalador del mdulo CCP
Existen cuatro tipos de configuracin del pre-escalador, especificado por los bits
CCPxM3:CCPxM0. Cuando el mdulo CCP sea apagado o no se encuentre en el modo
captura, el contador del pre-escalador ser borrado (cleared). Esto significa que cualquier
condicin de arranque (reset) borrar el contador del pre-escalador.
Conmutando de una configuracin del pre-escalador de captura a otra, podra generarse una
interrupcin. Asimismo, el contador del pre-escalador no sera borrado (cleared) y por
consiguiente la primera captura podra ser de un pre-escalador diferente a cero. El ejemplo
15.1 muestra el mtodo recomendado para conmutar entre las diferentes configuraciones del
pre-escalador de captura. Este ejemplo tambin borrar el contador del pre-escalador y no
generar una interrupcin.
Ejemplo 15.1

Cambiando entre pre-escaladores de captura

140

Para borrar el contador del pre-escalador de captura, el mdulo CCP deber ser configurado
en cualquier modo de no-captura (Captura, PWM o apagado).
Operacin de reposo (sleep)
Cuando el microcontrolador es puesto en reposo (sleep), el Timer1 no se incrementar (debido
a que ste se encuentra en modo asncrono), pero el pre-escalador continuar contando los
eventos (no sincronizado). Cuando un evento de captura especfico ocurra, el bit CCPxIF se
encender, pero el registro de captura no se actualizar. Si las interrupciones del mdulo CCP
son habilitadas, el microcontrolador ser despertado (wake-up) del estado de reposo (sleep). El
valor en el registro TMR1 de 16 bits no es transferido al registro de captura de 16 bits, ya que
como el temporizador no estuvo incrementndose, este valor no tendra ningn significado. En
efecto, esto permite al pin CCP a ser usado como otra interrupcin externa.
Efectos de una condicin de arranque (reset)
El mdulo CCP se apagar y el valor en el pre-escalador ser forzado a 0.
Modo Compara
En modo Compara, el valor del registro CCPRx de 16 bits es constantemente comparado con
el valor del par de registros del temporizador TMR1. Cuando una condicin de coincidencia
(match) ocurre, el pin CCPx ser:

Manejado alto (Driven High)


Manejado bajo (Driven Low)
Permanece sin cambio

La accin sobre el pin es basada dependiendo del valor de los bits de control
CCPxM3:CCPxM0 (CCPxCON<3:0>). Al mismo tiempo, una interrupcin de comparacin ser
tambin generada.
Nota:

El Timer1 deber estar corriendo en modo temporizador (timer) o en modo contador


sincronizado si el mdulo CCP esta siendo usado con la caracterstica de comparacin.
En el modo contador asncrono, la operacin de comparacin pudiera no trabajar.
Figura 15.2 Diagrma de bloques de la operacin en modo Compara

141

Operacin del pin CCP en modo Compara


El usuario deber configurar el pin CCPx como una salida, apagando el bit TRIS apropiado.
Nota:

Borrando (clearing) el registro CCPxCON forzar el latch de comparacin del CCPx


de salida al nivel bajo (default). Este no es el latch de dato del puerto de
entrada/salida (I/O).

Seleccionando el modo comparacin de salida (compare output mode), forzar el estado del
pin CCP que es opuesto al estado de coincidencia (match). As, si el modo Compara es
seleccionado a forzar el pin de salida bajo cuando exista coincidencia (match), entonces la
salida ser forzada alta hasta que la condicin de coincidencia ocurra (o el modo sea
cambiado).
Modo de interrupcin por programa
Cuando es elegido el modo de interrupcin por programa, el pin CCPx no es afectado,
nicamente una interrupcin del mdulo CCP es generada (si se encuentra habilitada).
Disparo por evento especial (Special Event Trigger)
En este modo, un disparo interno (por hardware) es generado, lo cual podr ser usado para
iniciar alguna accin.
La salida del disparo por evento especial del CCPx inicializar (resets) el par de registros
TMR1. Esto permitir al registro CCPRx a ser efectivamente un registro programable de
periodo de 16 bits para el Timer1.
Para algunos modelos de microcontroladores, la salida del disparo especial del mdulo CCP
inicializar (resets) el par de registros TMR1 e iniciar una conversin A/D (si el mdulo A/D se
encuentra habilitado).
Nota:

El disparo por evento especial no prender el bit de bandera de interrupcin del Timer1,
TMR1IF.

Operacin en estado de reposo (sleep)


Cuando el microcontrolador sea puesto en el estado de reposo (sleep), el Timer1 no se
incrementar (debido a que se encuentra en el modo sincrnico), y el estado del mdulo no
cambiar. Si el pin CCP se encuentra manejando (driving) un valor, este continuar manejando
dicho valor. Cuando el microcontrolador sea despertado, ste continuar formando este estado.
Efectos de una condicin de arranque (Reset)
El mdulo CCP ser apagado.
Modo PWM
En el modo de modulacin por ancho del pulso (Pulse Width Modulation) PWM, el pin CCPx
producir una salida PWM de 10 bits de resolucin. Debido a que el pin CCPx es

142

multiplexado con el latch de dato del puerto, el correspondiente bit TRIS deber ser
apagado para hacer el pin CCPx como una salida.
Nota:

Borrando (clearing) el registro CCPxCON forzar el latch de salida PWM a su nivel


bajo (default). Este no es el latch de dato del puerto de entrada/salida (I/O port).

La figura 15.3 muestra un diagrma de bloques simplificado del mdulo CCP para operar como
PWM.
Figura 15.3

Diagrma de bloques simplificado del PWM

Una salida PWM (figura 15.4) tiene una base de tiempo (periodo) y un tiempo en que la salida
permanece alta (ciclo alto). La frecuencia de la salida PWM ser el inverso del periodo
(1/periodo).

143

Figura 15.4

Salida PWM

Periodo PWM
El periodo PWM es especificado escribiendo en el registro PR2. El periodo PWM puede ser
calculado usando la siguiente frmula:
Periodo PWM = [(PR2) + 1] * 4 * TOSC * (valor del pre-escalador TMR2), en unidades de tiempo
La frecuencia PWM (FPWM) es definida como 1 / [periodo PWM].
Cuando TMR2 sea igual a PR2, los siguientes tres eventos ocurrirn en el prximo ciclo de
incremento:

Nota:

TMR2 ser borrado (cleared)


El pin CCPx ser encendido (excepto si el ciclo de trabajo PWM=0%)
El ciclo de trabajo (PWM duty cycle) es guardado (latched) de CCPRxL a CCPRxH
El post-escalador del Timer2 no es usado en la determinacin de la frecuencia PWM. El
post-escalador podra ser usado para tener una relacin actualizada del servo (servo
update rate) a una frecuencia diferente que la salida PWM.

Ciclo de trabajo (Duty Cycle) PWM


El ciclo de trabajo PWM es especificado escribiendo en el registro CCPRxL y los bits
DCxB1:DCxB0 (CCPxCO<5:4>). Hasta 10 bits de resolucin es disponible: el CCPRxL
contiene los ocho bits ms significantes mientras que CCPxCON<5:4> contendr los dos bits
menos significantes. Este valor de 10 bits es representado por DCxB9:DCxB0.
La siguiente ecuacin es usada para calcular el ciclo de trabajo (duty cycle) PWM:
Ciclo de trabajo PWM = (valor DCxB9:DCxB0) * TOSC * (valor del TMR2), en unidades de
tiempo
Los bits DCxB9:DCxB0 podrn ser escritos en cualquier momento, pero el valor del ciclo de
trabajo (duty cycle) no ser guardado (latched) en el registro CCPRxH hasta despus de que
la coincidencia (match) entre los registros PR2 y TMR2 haya ocurrido (lo cual ser el final del
actual periodo). En el modo PWM, el registro CCPRxH es solo de lectura.
El registro CCPRxH y los dos latches internos son usados para doblar el buffer del ciclo de
trabajo PWM, lo cual es esencial para una operacin PWM sin fallas.

144

Cuando el registro CCPRxH y el latch de dos bits coincidan (match) con el registro TMR2
concatenado con los dos bits del reloj Q interno (o dos bits del pre-escalador TMR2), el pin
CCPx ser apagado (cleared). Esto ser el fin del ciclo de trabajo.
La mxima resolucin PWM (bits) para una frecuencia PWM dada ser:

Nota:

Si el valor del ciclo de trabajo PWM es mayor que el periodo PWM, el pin CCPx no ser
apagado (cleared). Esto permitir un ciclo de trabajo del 100%.

Mnima resolucin
La mnima resolucin (en tiempo) de cada bit del ciclo de trabajo PWM depender del preescalador del Timer2.
Tabla 15.4 Mnimo tiempo de bit del ciclo de trabajo
(Minimum Duty Cycle Bit Time)

Ejemplo 15.2

Clculo del periodo PWM y ciclo de trabajo PWM

Lo ms que podr ser obtenido de una frecuencia de 78.125 KHz y un oscilador de 20 MHz
ser una resolucin del ciclo de trabajo de 8 bits, es decir,

145

Cualquier valor mayor a 255 resultar en un ciclo de trabajo del 100%.


Para lograr ms alta resolucin, la frecuencia PWM deber ser decrementada. Para lograr ms
alta frecuencia PWM, la resolucin deber ser decrementada.
La tabla 15.5 lista algunos ejemplos de frecuencias PWM y resoluciones para FOSC = 20 MHZ.
Los valores del pre-escalador TMR2 y del registro PR2 son tambin mostrados.
Tabla 15.5

Ejemplos de frecuencia PWM y bit de resolucin a 20 MHz

Configuracin para la operacin en PWM


Los siguientes pasos configurarn el mdulo CCP para operar en PWM:
1.
2.
3.
4.
5.

Establecer el periodo PWM escribiendo en el registro PR2.


Establecer el ciclo de trabajo PWM escribiendo los bits DCxB9:DCxB0.
Hacer el pin CCPx una salida apagando el bit TRIS apropiado.
Establecer el valor del pre-escalador TMR2 y habilitar el Timer2 escribiendo a T2CON.
Configurar el mdulo CCP para operar en el modo PWM.

Operacin en estado de reposo (sleep)


Cuando el microcontrolador sea puesto en su estado de reposo (sleep), el Timer2 no se
incrementar y el estado del mdulo no cambiar. Si el pin CCP esta manejando (driven) un
valor, ste continuar hacindolo. Cuando el microcontrolador sea despertado (wake-up), ste
continuar a partir de ese estado.
Efectos de una condicin de arranque (Reset)
El mdulo CCP ser apagado.
Inicializacin
El mdulo CCP tiene tres modos de operacin. El ejemplo 15.3 muestra la inicializacin en
modo Captura. El ejemplo 15.4 muestra la inicializacin en modo Compara y el ejemplo 15.5
muestra la inicializacin en modo PWM.

146

Ejemplo 15.3 Inicializacin en modo Captura

Ejemplo 15.4 Inicializacin en modo Compara

147

Ejemplo 15.5 Inicializacin en modo PWM

148

16 Puerto serial sincrnico (SSP)

El mdulo del puerto serial sincrnico (Synchronous Serial Port) (SSP) es una interfase serial
muy til para comunicarse con otros dispositivos perifricos o microcontroladores. Estos
dispositivos perifricos pueden ser: memorias EEPROMs, registros de corrimiento (shift
registers), manejadores de despliegue (display drivers), convertidores A/D, etc. El mdulo SSP
podr operar en uno de dos modos:

Interfase serial perifrica (Serial Peripheral Interface)

Circuito Inter-integrado (Inter-Integrated Circuit)


o
o

Modo esclavo (Slave mode)


Control de pendiente (I/O Slope Control), y deteccin de bits de inicio (Start) y
paro (Stop) para fcil implementacin del programa de modos Maestro
(Master) y Multi-maestro (Multi-master)

Registros de control
Registro SSPSTAT (Synchronous Serial Port Status)

bit 7

SMP: Fase de la muestra de la entrada de datos SPI (SPI Data Input Sample Phase)
Modo SPI Maestro (SPI Master Mode)
1 = Entrada de datos muestreada al final del tiempo de la salida de datos
0 = Entrada de datos muestreada en medio del tiempo de la salida de datos
Modo SPI Esclavo (SPI Slave Mode)
SMP deber estar apagado cuando SPI sea usado en modo esclavo (slave mode)

bit 6

CKE: Seleccin del flanco del reloj del SPI (SPI Clock Edge Select)
(Ver figura 16.3, figura 16.4y figura 16.5)
CKP = 0 (SSPCON<4>)
1 = Data transmitido sobre el flanco de subida (rising edge) del SCK
0 = Data transmitido sobre el flanco de bajada (falling edge) del SCK
CKP = 1 (SSPCON<4>)
1 = Data transmitido sobre el flanco de bajada (falling edge) del SCK
0 = Data transmitido sobre el flanco de subida (rising edge) del SCK

bit 5

D/A: Bit de Dato/Direccin (Data/Address) (modo I C nicamente)

149

1 = Indica que el ltimo byte recibido o transmitido fu dato (Data)


0 = Indica que el ltimo byte recibido o transmitido fu direccin (Address)
bit 4

P: Bit de paro (Stop)


(I2C nicamente. Este bit es apagado cuando el mdulo SSP es deshabilitado)
1 = Indica que un bit de paro (Stop) ha sido detectado (este bit es 0 en reset)
0 = El bit de paro (Stop) no ha sido detectado

bit 3

S: Bit de inicio (Start)


2
(I C nicamente. Este bit es apagado cuando el mdulo SSP es deshabilitado)
1 = Indica que un bit de inicio (Start) ha sido detectado (este bit es 0 en reset)
0 = El bit de inicio (Start) no ha sido detectado

bit 2

R/W: Bit de informacin de lectura/escritura (Read/Write) (modo I C nicamente)

Este bit mantiene la informacin del bit R/W posterior a la ltima coincidencia de
direccin (address match). Este bit es vlido nicamente desde la coincidencia de
direccin (address match) al prximo bit de inicio (Start), bit de paro (Stop) o bit NOACK.
1 = Lectura (Read)
0 = Escritura (Write)
2

bit 1

UA: Actualiza direccin (Update Address) (modo I C de 10 bits nicamente)


1 = Indica que el usuario necesita actualizar la direccin en el registro SSPADD
0 = La direccin no necesita ser actualizada

bit 0

BF: Bit del estado de memoria (buffer) completa (Buffer Full Status)
2

Recepcin (modos SPI e I C)


1 = Recepcin completa, SSPBUF est completo (lleno)
0 = Recepcin no completa, SSPBUF est vaco
2

Transmisin (modo I C nicamente)


1 = Transmisin en progreso, SSPBUF est completo (lleno)
0 = Transmisin completa, SSPBUF est vaco
R = Bit de lectura
W = Bit de escritura
U = Bit no implementado, ledo como 0

- n = Valor al arranque (Reset) POR

SSPCON: Registro de control del puerto serial sincrnico

bit 7

WCOL: Bit de deteccin de colisin de escritura (Write Collision Detect)


1 = El registro SSPBUF es escrito mientras se encuentra todava transmitiendo la
palabra previa. (Deber ser apagada por programa)
0 = No hay colisin

bit 6

SSPOV: Bit indicador de sobre-flujo en recepcin (Receive Overflow Indicator)


En modo SPI:

150

1 = Un nuevo byte fu recibido mientras el registro SSPBUF estaba sujetando el dato


previo. En caso de sobre-flujo, el dato en SSPSR se perder y el SSPBUF no ser
ms actualizado. Sobre-flujo podr ocurrir nicamente en modo esclavo. El usuario
deber leer el SSPBUF, an si solo se transmiten datos, para prevenir una
condicin de sobre-flujo. En modo maestro el bit de sobre-flujo no ser encendido
cada nueva recepcin (y transmisin) iniciada por la escritura del registro SSPBUF.
0 = No hay sobre-flujo
2

En modo I C:
1 = Un byte es recibido mientras el registro SSPBUF se encuentra todava sujetando el
byte previo. El bit SSPOV es del tipo no importa (dont care) en modo transmisin.
Este bit deber ser apagado por programa en cualquier modo.
0 = No hay sobre-flujo
bit 5

SSPEN: Bit de habilitacin del puerto serial sincrnico (Synchronous Serial Port Enable)
En ambos modos, cuando son habilitados, estos pines debern ser propiamente
configurados como entrada o como salida.
En modo SPI:
1 = Habilita el puerto serial y configura SCK, SDO, SDI, SS como los pines de la fuente
del puerto serial
0 = Deshabilita el puerto serial y configura estos pines como un puerto de
entrada/salida (I/O port)
2

En modo I C:
1 = Habilita el puerto serial y configura SDA y SCL como los pines de la fuente
del puerto serial
0 = Deshabilita el puerto serial y configura estos pines como un puerto de
entrada/salida (I/O port)
bit 4

CKP: Bit de eleccin de polaridad del reloj (Clock Polarity Select)


En modo SPI:
1 = El estado inactivo (Idle state) para el reloj es un nivel alto
0 = El estado inactivo (Idle state) para el reloj es un nivel bajo
2

En modo I C:
Control de liberacin SCK
1 = Habilita el reloj
0 = Mantiene el reloj bajo (reloj alargado) (clock stretch), usado para asegurar el setup
time del dato
bit 3:0 SSPM3:SSPM0: Bits de seleccin del modo del puerto serial sincrnico
(Synchronous Serial Port Mode Select)
0000 = Modo maestro SPI, reloj = FOSC/4
0001 = Modo maestro SPI, reloj = FOSC/16
0010 = Modo maestro SPI, reloj = FOSC/64
0011 = Modo maestro SPI, reloj = Salida del TMR2/2
0100 = Modo esclavo SPI, reloj = pin SCK, pin de control SS habilitado
0101 = Modo esclavo SPI, reloj = pin SCK, pin de control SS deshabilitado. SS puede
ser usado como un pin de entrada/salida (I/O)
2
0110 = Modo esclavo I C, direccin de 7 bits
2
0111 = Modo esclavo I C, direccin de 10 bits
1000 = Reservado

151

1001 = Reservado
1010 = Reservado
2
1011 = Modo maestro controlado por el programa (firmware) I C (esclavo inactivo)
1100 = Reservado
1101 = Reservado
1110 = Modo esclavo I2C, direccin de 7 bits con bits de inicio (Start) y de paro (Stop) e
interrupcin habilitada
2
1111 = Modo esclavo I C, direccin de 10 bits con bits de inicio (Start) y de paro (Stop)
e interrupcin habilitada
Modo SPI
El modo SPI permite que datos de 8 bits sean transmitidos y recibidos sincrnicamente y
simultneamente. Los cuatro modos de SPI son soportados.
Para lograr la comunicacin, tres pines son usados:

Salida de datos serial (Serial Data Out) (SDO)


Entrada de datos serial (Serial Data In) (SDI)
Reloj serial (Serial Clock) (SCK)

Adicionalmente un cuarto pin podra ser usado en el modo esclavo de operacin:

Seleccin de esclavo (Slave Select) (SS)

Operacin
Cuando se inicializa el SPI, varias opciones necesitarn ser especificadas. Lo anterior es hecho
mediante la programacin de bits de control apropiados en el registro SSPCON
(SSPCON<5:0>) y SSPSTAT<7:6>). Estos bits de control permiten especificar lo siguiente:

Modo maestro (Master Mode) (SCK es la salida del reloj)


Modo esclavo (Slave Mode) (SCK es la entrada del reloj)
Polaridad del reloj (Clock Polarity) (estado activo de SCK)
Flanco del reloj (Clock edge) (salida del dato con el flanco de subida/bajada
(rising/falling edge) de SCK)
Fase de muestreo del dato de entrada (Data Input Sample Phase)
Relacin del reloj (Clock Rate) (nicamente modo maestro)
Modo de seleccin de esclavo (Slave Select Mode) (modo esclavo nicamente)

La figura 16.1 muestra el diagrma de bloques del mdulo SSP cuando se encuentra en modo
SPI.

152

Figura 16.1

Diagrma de bloques del mdulo SSP (Modo SPI)

El mdulo SSP consiste de un registro de corrimiento de transmisin/recepcin, SSPSR, y un


registro de memoria (buffer), SSPBUF. El registro SSPSR desplaza el dato hacia adentro y
hacia afuera del microcontrolador, con el bit ms significante primero. El registro SSPBUF
sujeta el dato que fu escrito al registro SSPSR, hasta que el dato recibido este listo. Una vez
que los 8 bits del dato han sido recibidos, ese byte es movido al registro SSPBUF. Es entonces
que el bit de deteccin de memoria (buffer) completo, BF (SSPSTAT<0>), y el bit de bandera
de interrupcin, SSPIF, son encendidos. Esta doble memoria (buffering) de recepcin de datos
(SSPBUF) permite que el prximo byte pueda iniciar su recepcin antes de que sea ledo el
dato que fu recin recibido. Cualquier escritura al registro SSPBUF durante
transmisin/recepcin de datos ser ignorada y el bit de deteccin de colisin de escritura,
WCOL (SSPCON<7>), ser encendido. El programa del usuario deber apagar el bit WCOL de
manera tal que pueda ser determinado si la siguiente operacin de escritura al registro
SSPBUF fu completada exitosamente. Cuando el programa de aplicacin este esperando a
recibir un dato vlido, el registro SSPBUF debera ser ledo antes de que el prximo byte de
dato a transferir sea escrito en el registro SSPBUF. El bit de memoria completa (llena) (Buffer
Full), BF (SSPSTAT<0>), indicar cuando ha sido cargado el registro SSPBUF con el dato
recibido (la transmisin es completada). Cuando el registro SSPBUF sea ledo, el bit BF ser
apagado. Este dato podra ser irrelevante si el SPI es solo un transmisor. Generalmente las
interrupciones del mdulo SSP son utilizadas para determinar cuando una
transmisin/recepcin ha sido completada. El registro SSPBUF deber ser ledo y/o escrito.

153

Ahora bien, si el mtodo de interrupciones no fuese utilizado, entonces la lectura del bit de
colisin de escritura podra ser hecha, para asegurar que este evento no ha ocurrido. El
ejemplo 16.1 muestra el cargado del registro SSPBUF (y en consecuencia en el registro
SSPSR) para transmisin de datos. Las instrucciones sombreadas nicamente sern
requeridas si el dato recibido es significativo (ya que algunas aplicaciones de SPI son
nicamente de transmisin).
Ejemplo 16.1 Cargando el registro SSPBUF (SSPSR)

No es posible escribir ni leer directamente el registro SSPSR y nicamente podr ser accedido
a travs del registro SSPBUF. Adicionalmente, el registro SSPSTAT indicar las diferentes
condiciones de estado del mdulo SSP.
Habilitando la entrada/salida (I/O) del SPI
Para habilitar el puerto serial deber encenderse el bit de habilitacin del mdulo SSP, SSPEN
(SSPCON<5>). Para iniciar (reset) o reconfigurar el modo SPI, apague el bit SSPEN, el cual reinicializar el registro SSPCON, y posteriormente encender el bit SSPEN. Esto configurar los
pines SDI, SDO, SCK y SS como pines del puerto serial. Para que los pines se comporten de
acuerdo a la funcin de puerto serial, debern estar adecuadamente programados los bits de
direccin del dato (en el registro TRIS). Esto es:

SDI deber tener el bit TRIS encendido.


SDO deber tener el bit TRIS apagado.
SCK (modo maestro) (Master mode) deber tener el bit TRIS apagado.
SCK (modo esclavo) (Slave mode) deber tener el bit TRIS apagado.
SS deber tener el bit TRIS encendido.

Cualquier funcin del puerto serial que no sea deseada podr ser deshabilitada mediante la
programacin del bit de direccin de dato del registro TRIS a su valor opuesto. Un ejemplo
podra ser en modo maestro donde solo se enven datos (a un manejador de despliegue
(display driver) por ejemplo), entonces los pines SDI y SS podran ser usados como salidas de
propsito general, mediante el apagado de los bits correspondientes en el registro TRIS.
Conexin tpica
La figura 16.2 muestra una conexin tpica entre dos microcontroladores. El controlador
maestro (Procesador 1) inicia la transferencia de datos mediante el envo de la seal SCK. El
dato es corrido a travs de sus registros de corrimiento con el flanco del reloj programado y
atrapado (latched) con el flanco del reloj especificado por el bit SMP. Ambos procesadores
deberan ser programados con la misma polaridad del reloj (Clock Polarity) (CKP), con lo que
ambos procesadores podran enviar y recibir datos al mismo tiempo. El dato podr ser

154

significativo o de relleno (dummy data) dependiendo del programa de aplicacin. Esto nos gua
a tres escenarios para la transmisin de datos:

El maestro enva datos El esclavo enva relleno (dummy data)


El maestro enva datos El esclavo enva datos
El maestro enva relleno (dummy data) El esclavo enva datos
Figura 16.2

Conexin Maestro/Esclavo en SPI

Operacin como maestro (Master Operation)


El maestro podr iniciar la transferencia de datos a cualquier tiempo debido a que ste controla
la seal SCK. El maestro determinar cuando el esclavo (procesador 2) podr enviar datos
mediante el protocolo del programa.
En modo maestro el dato es transmitido/recibido tan pronto como es escrito en el registro
SSPBUF. Si el SPI nicamente va a recibir, la salida SDO podra ser deshabilitada
(programada como una entrada). El registro SSPSR continuar haciendo el corrimiento en la
seal presente sobre el pin SDI de acuerdo a la velocidad (clock rate) programada. Conforme
cada byte es recibido, ste ser cargado en el registro SSPBUF como si un byte normal
hubiese sido recibido (bit de interrupcin y bit de estado debidamente programados). Esto
podra ser til en aplicaciones de recepcin tales como el monitoreo de actividad en lnea.
La polaridad del reloj (clock polarity) es seleccionada mediante la apropiada programacin del
bit CKP (SSPCON<4>). Esto nos dara el tipo de formas de onda para la comunicacin SPI
como se muestra en las figuras 16:3, 16.4 y 16.5 donde el bit ms significante es transmitido
primero. En modo maestro, la velocidad (clock rate) o bit rate es programable por el usuario a
una de las siguientes opciones:

FOSC/4 (o TCY)
FOSC/16 (o 4 * TCY)
FOSC/64 (o 16 * TCY)
Salida del Timer2 / 2 (Timer2 output divided by 2)

Esto permitir una relacin de datos (data rate) mxima de 5 Mbps (Megabits per second) a 20
MHz.

155

Figura 16.3

Formas de onda en modo SPI, modo maestro

Operacin como esclavo (Slave Operation)


En modo esclavo el dato es transmitido/recibido conforme aparecen los pulsos del reloj externo
sobre el pin SCK. Cuando el ltimo bit es atrapado (latched), el bit de bandera de interrupcin
SSPIF es encendido.
La polaridad del reloj (Clock Polarity) es seleccionada mediante la programacin adecuada del
bit CKP (SSPCON<4>). Esto nos proporciona la forma de onda de la comunicacin SPI como
se muestra en las figuras 16:3, 16.4 y 16.5 donde el bit ms significante es transmitido primero.
Cuando se encuentra el modo esclavo el reloj externo deber cumplir con los tiempos de
subida y bajada mnimos.
En modo de reposo (sleep mode), el esclavo podr transmitir y recibir datos. Cuando un byte
sea recibido, el microcontrolador se despertar del estado de reposo (sleep), si las
interrupciones se encuentran habilitadas.

156

Figura 16.4 Formas de onda en modo SPI, modo esclavo (con CKE = 0)

Modo esclavo seleccionado (Slave Select Mode)


Cuando se encuentre en el modo esclavo seleccionado, el pin SS permitir una conexin
multi-drop a mltiples esclavos con un solo maestro. El SPI deber estar en modo esclavo
(SSPCON<3:0> = 04h) y el bit TRIS, para el pin SS, deber estar encendido para que pueda
ser habilitado el modo esclavo seleccionado (Slave Select Mode). Cuando el pin SS sea bajo,
la transmisin y recepcin sern habilitadas y el pin SDO ser manejado (driven). Cuando el
pin SS vaya alto, el pin SDO ya no ser manejado, an en medio de un byte transmitido, y el
pin vendr a ser una salida flotante. Dependiendo de la aplicacin, pudiera ser deseable la
instalacin de resistencias pull-up o pull-down externas.
Cuando el SPI se encuentre en modo esclavo con el pin de control SS habilitado
(SSPCON<3:0> = 0100), el mdulo SPI ser iniciado (reset) si el pin SS es puesto a VDD. Si el
mdulo SPI es usado en modo esclavo con el bit CKE encendido, entonces el pin de control SS
deber ser habilitado.
Cuando el mdulo SPI se inicie (reset), el contador de bits ser forzado a 0. Esto podr ser
hecho forzando el pin SS a un nivel alto o apagando el bit SSPEN. (Figura 16.6).
Para emular la comunicacin a dos hilos, el pin SDO podr ser conectado al pin SDI. Cuando el
mdulo SPI necesite operar como un receptor, el pin SDO podr ser configurado como entrada.
Esto deshabilitar las transmisiones desde el pin SDO. El mdulo SDI podr siempre ser una
entrada (funcin SDI) debido a que esto no podra crear un conflicto con el bus.

157

Figura 16.5

Formas de onda en modo SPI (modo seleccin de esclavo con CKE = 1)

Figura 16.6

Formas de onda de la sincronizacin de un esclavo

158

Operacin en modo de reposo (Sleep operation)


En modo maestro todos los relojes de los mdulos son suspendidos (halted), y la
transmisin/recepcin permanecer en ese estado hasta que el microcontrolador sea
despertado (wake-up) de su estado de reposo (sleep). Una vez que el microcontrolador regrese
a su modo normal de operacin, el mdulo continuar transmitiendo/recibiendo el dato.
En modo esclavo, el registro de corrimiento (shift register) de transmisin / recepcin del
mdulo SPI operar en modo asncrono al microcontrolador, lo que permitir que el dispositivo
pueda ser puesto en modo de reposo (sleep) y al mismo tiempo, el dato ser enviado a travs
del registro de corrimiento (shift register) del mdulo SPI. Cuando los 8 bits han sido recibidos,
el bit de bandera de interrupcin del mdulo SSP ser encendido y si se encuentran
habilitadas las interrupciones, despertarn al microcontrolador del modo de reposo (sleep).
Efectos de un arranque (Reset)
Un arranque (Reset) deshabilita el mdulo SSP y termina la transferencia en curso.
Tabla 16.1

Registros asociados con la operacin del mdulo SPI

Operacin I C en el mdulo SSP


2

El mdulo SSP en el modo I C implementa completamente las funciones del modo esclavo,
excepto soporte a llamadas en general (general call support), y provee interrupcin en los bits
de inicio (Start) y paro (Stop) mediante hardware con el objeto de facilitar la implementacin
del programa referente a las funciones del maestro. El mdulo SSP implementa las
especificaciones del modo estndar as como el direccionamiento de 7 bits y de 10 bits.
Dos pines son utilizados para la transferencia de datos. Estos son el pin SCL, el cual
corresponde al reloj, y el pin SDA que corresponde al dato. El usuario deber configurar estos
pines como entradas mediante los bits del registro TRIS. Las funciones del mdulo SSP son
habilitadas encendiendo el bit de habilitacin SSPEN (SSPCON<5>).
Un filtro de falla imprevista (glitch) se encuentra en los pines SCL y SDA cuando stos son
configurados como entradas. El filtro opera en los modos de 100 KHz y 400 KHz. En el modo
de 100 KHz, cuando estos pines son configurados como salida, habr un control de giro de la

159

velocidad (slew rate control) del pin que ser independiente de la frecuencia del
microcontrolador.
Figura 16.7

Diagrma de bloques del mdulo SSP (modo I C)

El mdulo SSP tiene 5 registros para la operacin I C. Ellos son:

Registro de control SSP (SSPCON)


Registro de estado (status) SSP (SSPSTAT)
Memoria (buffer) serial de recepcin/transmisin (SSPBUF)
Registro de corrimiento (shift register) SSP (SSPSR) No directamente accesible
Registro de direccin (Address register) SSP (SSPADD)
2

El registro SSPCON permite controlar la operacin I C. Cuatro bits de seleccin de modo


2
(SSPCON<3:0>) permitirn seleccionar uno de los siguientes modos I C:

I C modo esclavo (direccin de 7 bits) (7-bit address)


2
I C modo esclavo (direccin de 10 bits) (10-bit address)
I2C modo Multi-maestro controlado por programa (interrupcin de los bits de inicio
(Start) y paro (Stop) habilitada)
2
I C modo Multi-maestro controlado por programa (interrupcin de los bits de inicio
(Start) y paro (Stop) habilitada)
2
I C modo maestro controlado por programa, el esclavo se encuentra inactivo (idle)
2

Antes de seleccionar cualquier modo I C, los pines SCL y SDA debern ser programados como
2
entradas, encendiendo los bits del registro TRIS adecuados. Seleccionando algn modo I C,
mediante el encendido del bit SSPEN, habilitar los pines SCL y SDA para ser usados como
2
las lneas de reloj y dato en modo I C.
El registro SSPSTAT nos proporciona el estado de la transferencia del dato. Esta informacin
incluye la deteccin de un bit de inicio (Start) o de paro (Stop), especifica si el byte recibido fu

160

dato o direccin, si el prximo byte es el complemento de una direccin de 10 bits, y si la actual


transferencia de dato es de lectura o escritura.
El registro SSPBUF es el registro en el cual la transferencia del dato es escrito a, o ledo de. El
registro SSPSR corre (shift) el dato dentro o fuera del microcontrolador. En operaciones de
recepcin, los registros SSPBUF y SSPSR crean una memoria (buffer) de recepcin doble.
Esto permitir que se inicie la recepcin del prximo byte antes de leer el dato previamente
recibido. Cuando el byte completo es recibido, ste ser transferido al registro SSPBUF y el bit
de bandera SSPIF ser encendido. Si otro byte completo fuese recibido antes de leer el
registro SSPBUF, una condicin de sobre-flujo (overflow) ocurrir, el bit SSPOV (SSPCON<6>)
ser encendido y el byte en el registro SSPSR se perder.
El registro SSPADD sujetar la direccin del esclavo (slave address). En el modo de direccin
de 10 bits, el usuario necesitar escribir el byte alto de la direccin (1111 0 A9 A8 0) seguido
del byte bajo (A7:A0).
Modo esclavo (Slave Mode)
En modo esclavo, los pines SCL y SDA debern ser configurados como entradas (bits en el
registro TRIS encendidos). El mdulo SSP substituir el estado de entrada con el dato de
salida cuando sea requerido (transmisor esclavo).
Cuando una direccin coincida (matched) o la transferencia de datos despus de una
coincidencia de direccin (address match) sea recibida, el hardware automticamente
generar un pulso de reconocimiento (acknowledge) (ACK), y posteriormente cargar el
registro SSPBUF con el valor recibido en el registro SSPSR.
Existen ciertas condiciones que causaran al mdulo SSP no proporcionar el pulso de
reconocimiento (ACK). Estas son una u otra (o ambas):
a) El bit de memoria completa (buffer full), BF (SSPSTAT<0>), fu encendido antes de
que el mensaje haya sido completado.
b) El bit de sobre-flujo (overflow), SSPOV (SSPCON<6>), fu encendido antes de que el
mensaje haya sido completado.
En este caso, el valor del registro SSPSR no ser cargado en el registro SSPBUF, sino que los
bits SSPIF y SSPOV sern encendidos. La tabla 16.2 muestra que pasa cuando una
transferencia de dato (un byte) es recibido, dados los bits de estado BF y SSPOV. Las celdas
sombreadas muestran la condicin donde el programa de usuario no apago propiamente la
condicin de sobre-flujo. El bit de bandera BF es apagado mediante la lectura del registro
SSPBUF mientras que el bit SSPOV es apagado a travs del programa.
La entrada de reloj SCL deber tener un tiempo mnimo y mximo adecuado para una correcta
2
operacin. La especificacin I C de los tiempos alto y bajo as como los requerimientos del
mdulo SSP son mostrados en la hoja de datos tcnicos (datasheet) correspondiente a cada
modelo de microcontrolador.
Direccionamiento (Addressing)
Una vez que el mdulo SSP ha sido habilitado, ste espera que ocurra una condicin de inicio
(Start). Posteriormente, los 8 bits del dato son corridos en el registro SSPSR. Todos los bits
entrantes son muestreados con el flanco de subida (rising edge) de la lnea de reloj (SCL). El
valor del registro SSPSR<7:1> es comparado con el valor del registro SSPADD. La direccin
es comparada con el flanco de bajada (falling edge) del octavo pulso de reloj (SCL). Si la

161

direccin coincide (match), y los bits BF y SSPOV se encuentran apagados, los siguientes
eventos ocurrirn:
a) El valor del registro SSPSR ser cargado dentro del registro SSPBUF con el flanco de
bajada (falling edge) del octavo pulso de reloj (SCL).
b) El bit de memoria completa (buffer full), BF, se encender con el flanco de bajada
(falling edge) del octavo pulso de reloj (SCL).
c) Un pulso de reconocimiento (ACK) ser generado.
d) El bit de bandera de interrupcin del mdulo SSP, SSPIF, se encender (y la
interrupcin ser generada si sta se encuentra habilitada) con el flanco de bajada
(falling edge) del noveno pulso de reloj (SCL).
En el modo de direccin de 10 bits, dos bytes de direccin necesitarn ser recibidos por el
esclavo. Los cinco bits ms significantes del primer byte de direccin especificarn si esta
direccin es de 10 bits. El bit R/W (Read/Write) (SSPSTAT<2>) deber especificar una
operacin de escritura tal que el dispositivo esclavo reciba el segundo byte de direccin. Para
una direccin de 10 bits, el primer byte podra verse como 1 1 1 1 0 A9 A8 0, donde A8 y A9
corresponden a los dos bits ms significantes de la direccin. La secuencia de eventos para
una direccin de 10 bits es como sigue, con los pasos 7 9 para el transmisor esclavo:
1. Recibe el primer byte (alto) de la direccin (los bits SSPIF, BF y UA (SSPSTAT<1>)
son encendidos.
2. Actualiza el registro SSPADD con el segundo byte (bajo) de la direccin (apaga el bit
UA y libera la lnea SCL).
3. Lee el registro SSPBUF (apaga el bit BF) y apaga el bit de bandera SSPIF.
4. Recibe el segundo byte (bajo) de la direccin (los bits SSPIF, BF y UA son
encendidos).
5. Actualiza el registro SSPADD con el byte alto de la direccin. Esto apagar el bit UA y
libera la lnea SCL.
6. Lee el registro SSPBUF (apaga el bit BF) y apaga el bit de bandera SSPIF.
7. Recibe repetidas condiciones de inicio (Start).
8. Recibe el primer byte (alto) de la direccin (los bits SSPIF y BF son encendidos).
9. Lee el registro SSPBUF (apaga el bit BF) y apaga el bit de bandera SSPIF.
Nota:

Siguiendo la condicin de re-inicio (RESTART) (paso 7) en el modo de 10 bits, el


usuario nicamente necesitar hacer coincidir (match) los primeros 7 bits de la
direccin. El usuario no actualizar el registro SSPADD para la segunda mitad de la
direccin.

Tabla 16.2

Acciones en una transferencia de datos (byte) recibida

162

Recepcin
Cuando el bit R/W del byte de direccin es apagado y una coincidencia de direccin (address
match) ocurre, el bit R/W del registro SSPSTST ser apagado. La direccin recibida es cargada
dentro del registro SSPBUF.
Cuando una condicin de sobre-flujo del byte de direccin exista, entonces no ser generado el
pulso de reconocimiento (ACK). Una condicin de sobre-flujo (overflow) es definida como una
de las dos: o bien, el bit BF (SSPSTAT<0>) se enciende o, el bit SSPOV (SSPCON<6>) se
enciende. As pues, cuando un byte sea recibido bajo estas condiciones, el intento de mover el
dato del registro SSPSR al registro SSPBUF, no generar ningn pulso de reconocimiento
(ACK).
Una interrupcin del mdulo SSP ser generada en cada transferencia de datos de un byte. El
bit de bandera SSPIF deber ser apagado por programa. El registro SSPSTAT es utilizado
para determinar el estado del byte recibido.
2

Figura 16.8 Formas de onda para una recepcin I C (direccin de 7 bits)

Figura 16.9 Formas de onda para una recepcin I2C (direccin de 10 bits)
En la siguiente pgina se muestra esta figura.

163

164

Transmisin
Cuando el bit del byte de direccin entrante esta encendido y una coincidencia de direccin
(address match) ocurre, el bit R/W del registro SSPSTAT se prender. La direccin recibida
ser cargada dentro del registro SSPBUF. El pulso de reconocimiento (ACK) ser enviado
sobre el noveno bit y el pin SCL se mantendr bajo. El dato a transmitir deber ser cargado en
el registro SSPBUF, el cual a su vez ser cargado en el registro SSPSR. Posteriormente el pin
SCL deber ser habilitado encendiendo el bit CKP (SSPCON<4>). El maestro deber
monitorear el pin SCL antes de acertar otro pulso de reloj. El dispositivo esclavo podra estar
sujetando al maestro mediante el alargamiento del reloj. Los ocho bits de dato son corridos
(shifted out) con el flanco de bajada (falling edge) de la entrada SCL. Esto asegurar que la
seal SDA ser vlida durante el tiempo alto de SCL (figura 15.10).
Una interrupcin SPP es generada por cada byte transferido. El bit de bandera SSPIF deber
ser apagado por programa y el registro SSPSTAT ser utilizado para determinar el estado del
byte transferido. El bit SSPIF ser encendido en el flanco de bajada (falling edge) del noveno
pulso de reloj.
Como un transmisor esclavo (slave-transmitter), el pulso de reconocimiento (ACK) procedente
del receptor maestro ser atrapado (latched) en el flanco de subida (rising edge) del noveno
pulso del reloj de entrada SCL. Si la lnea SDA fuese alta (no ACK), entonces la transferencia
del dato estar completa. Cuando el no ACK es atrapado (latched) por el esclavo, la lgica del
esclavo es iniciada (reset) y el esclavo entonces monitorea la ocurrencia de otro bit de inicio
(Start). Si la lnea SDA fuera baja (ACK), el transmisor del dato deber ser cargado en el
registro SSPBUF, el cual a su vez cargar el registro SSPSR. Posteriormente el pin SCL
deber ser habilitado encendiendo el bit CKP.
Figura 16.10

Formas de onda I C para transmisin (Direccin de 7 bits)

Figura 16.11 Formas de onda I C para transmisin (Direccin de 10 bits)


A continuacin se muestra la figura 16.11.

165

166

Arbitraje del reloj (Clock Arbitration)


El arbitraje del reloj hace que el dispositivo maestro inhiba el pin SCL de enviar el prximo
2
pulso de reloj. El mdulo SSP en el modo esclavo I C mantendr el pin SCL bajo cuando el
CPU necesite responder a la interrupcin SSP (el bit SSPIF es encendido mientras que el bit
CKP es apagado). El dato que requiere ser transmitido necesitar ser escrito en el registro
SSPBUF y posteriormente se necesitar encender el bit CKP con el objeto de permitirle al
maestro generar los pulsos de reloj requeridos.
Modo maestro (programa) (firmware)
El modo de operacin maestro es soportado mediante la generacin de interrupcin sobre la
deteccin de las condiciones de inicio (Start) y paro (Stop). Los bits de inicio (Start) (S) y paro
(Stop) (P) son apagados en un arranque (reset) o cuando el mdulo SSP es deshabilitado. El
2
control del bus I C podr ser tomado cuando el bit P sea encendido o el bus se encuentre
inactivo (idle) con el bit P y el bit S apagados.
En el modo maestro las lneas SCL y SDA son manipuladas mediante los bits del registro TRIS
correspondientes. El nivel de salida es siempre bajo independientemente del valor en el
registro del puerto PORT. As, cuando transmitamos un dato, un 1 deber tener su bit TRIS
prendido (entrada) (input) y un 0 deber tener su bit TRIS apagado (salida) (output). El mismo
escenario es vlido para la lnea SCL con referencia al bit TRIS.
Los eventos siguientes causarn que el bit de bandera de interrupcin SSP, SSPIF, sea
encendido (si las interrupciones del mdulo SSP se encuentran habilitadas):

Una condicin de inicio (Start)


Una condicin de paro (Stop)
Una transferencia de un byte transmitido/recibido

El modo de operacin maestro podr ser hecho con el modo esclavo inactivo (idle)
(SSPM3:SSPM0 = 1011) o con el modo esclavo activo (SSPM3:SSPM0 = 1110 o 1111).
Cuando el modo esclavo sea habilitado, el programa necesitar diferenciar la fuente de
interrupcin.
Modo multi-maestro (programa) (firmware)
En modo multi-maestro, la generacin de interrupcin sobre la deteccin de las condiciones de
inicio (Start) y paro (Stop) nos permiten determinar cuando el bus se encuentra libre. Los bits
de inicio (Start) (S) y paro (Stop) (P) son apagados en un arranque (reset) o cuando el mdulo
SSP es deshabilitado. El control del bus I2C podr ser tomado cuando el bit P (SSPSTAT<4>)
sea encendido o el bus se encuentre inactivo (idle) con el bit P y el bit S apagados. Cuando el
bus este ocupado, la habilitacin de interrupcin SSP generar una interrupcin cuando la
condicin de paro (Stop) ocurra.
En el modo multi-maestro, la lnea SDA deber ser monitoreada para ver si el nivel de la seal
es el nivel de salida esperado. Esta revisin nicamente deber ser hecha cuando la salida
tenga un nivel alto. Si un nivel alto es esperado pero un nivel bajo esta presente, el dispositivo
deber liberar las lneas SCL y SDA (prendiendo los bits del registro TRIS correspondientes).
Existen dos etapas en donde este arbitraje pudiera ser perdido, y ellas son:

Transferencia de direccin (Address transfer)


Transferencia de datos (Data transfer)

167

Cuando la lgica del esclavo es habilitada, el esclavo contina recibiendo. Si el arbitraje fuese
perdido durante la etapa de una transferencia de direccin, la causa podra ser que una
comunicacin hacia el dispositivo pudiera estar en progreso. Si fuese direccionado el
dispositivo, un pulso de reconocimiento (ACK) sera generado. Si el arbitraje fuese perdido
durante una etapa de transferencia de datos, el dispositivo necesitar re-transmitir ese dato un
tiempo ms tarde.
Operacin de reposo (sleep)
2

Mientras el microcontrolador se encuentre en el modo de reposo (sleep), el mdulo I C podr


recibir direcciones o datos, y cuando una direccin coincida (match) o la transferencia del byte
sea completada, ocurrir que el procesador ser despertado (wake) de su estado de reposo
(sleep) (siempre y cuando las interrupciones del mdulo SSP se encuentren habilitadas).
Efectos de una condicin de arranque (Reset)
Una condicin de arranque (reset) deshabilitar el mdulo SSP y terminar la transferencia
actual.
Tabla 16.3

Registros asociados con la operacin I C

Inicializacin
Ejemplo 16.2 Inicializacin en el modo SPI maestro

168

Compatibilidad entre el mdulo SSP y el mdulo Bsico SSP


Cuando fu mejorado el mdulo SSP a partir del mdulo bsico SSP, el registro SSPSTAT
creci con dos bits de control adicionales. Estos bits son nicamente utilizados en el modo SPI
y son:

SMP, fase de muestreo del dato de entrada (SPI data input sample phase)
CKE, selector del flanco del reloj SPI (SPI Clock Edge Select)

Para ser compatible con el SPI del mdulo bsico SSP, estos bits debern ser apropiadamente
configurados. Si estos bits no se encuentran en los estados mostrados en la tabla 16.4, una
comunicacin SPI impropia podra ocurrir.
Tabla 16.4 Compatibilidad para los estados de los nuevos bits

169

170

17

USART

El mdulo de transmisin y recepcin universal sincrnico/asncrono (Universal Synchronous


Asynchronous Receiver Transmitter) (USART) es uno de los dos mdulos seriales de
entrada/salida (el otro es el mdulo SSP). El USART es conocido como una interfase serial de
comunicaciones o SCI. El USART puede ser configurado como un sistema asncrono duplex
completo (full duplex) que puede comunicarse con dispositivos perifricos tales como
terminales de datos (CRT Terminals) y computadoras personales, o bien puede ser configurado
como un sistema sincrnico medio duplex (half duplex) que puede comunicarse con
dispositivos perifricos tales como circuitos integrados convertidores A/D (analgico/digital) o
D/A (digital/analgico), memorias EEPROM seriales, etc.
El mdulo USART podr ser configurado en los siguientes modos:

Asncrono (asynchronous) duplex completo (full duplex)


Sincrnico maestro (synchronous - master) medio duplex (half duplex)
Sincrnico esclavo (synchronous - slave) medio duplex (half duplex)

El bit SPEN (RCSTA<7>), y los bits TRIS, tendrn que ser puestos adecuadamente para
configurar los pines TX/CK y RX/DT.
Registro de control y estado del transmisor
Registro TXSTA (Transmit Status and Control)

bit 7

CSRC: Bit de seleccin de la fuente del reloj (Clock Source Select)


Modo asncrono
No importa
Modo sincrnico
1 = Modo maestro (master mode) (reloj internamente generado desde BRG)
0 = Modo esclavo (slave mode) (reloj generado desde una fuente externa)

bit 6
bit 5

bit 4

TX9: Bit de habilitacin del 9 bit de transmisin (9-bit Transmit Enable)


1 = Selecciona una transmisin de 9 bits
0 = Selecciona una transmisin de 8 bits
TXEN: Bit de habilitacin de transmisin (Transmit Enable)
1 = Transmisin habilitada
0 = Transmisin deshabilitada
SYNC: Bit de seleccin de modo de USART (USART Mode Select)

171

1 = Modo sincrnico (Synchronous Mode)


0 = Modo asncrono (Asynchronous Mode)
bit 3
bit 2

No implementado: Ledo como 0


BRGH: Bit de seleccin de relacin de bauds alta (High Baud Rate Select)
Modo asncrono
1 = Velocidad alta (High speed)
0 = Velocidad baja (Low speed)
Modo sincrnico
No utilizado es este modo

bit 1

TRMT: Bit de estado del registro de corrimiento del transmisor (TSR)


(Transmit Shift Register Status)
1 = TSR vaco
0 = TSR lleno

bit 0

TX9D: 9 bit del dato a transmitir. Puede ser el bit de paridad


R = Bit de lectura
W = Bit de escritura
U = Bit no implementado, ledo como 0

- n = Valor al arranque (reset) POR

Registro de control y estado del receptor


Registro RCSTA (Receive Status and Control)

bit 7

SPEN: Bit de habilitacin del puerto serial (Serial Port Enable)


1 = Puerto serial habilitado (configura los pines RX/DT y TX/CK)
0 = Puerto serial deshabilitado

bit 6

RX9: Bit de habilitacin del 9 bit de recepcin (9-bit Receive Enable)


1 = Selecciona recepcin de 9 bits
0 = Selecciona recepcin de 8 bits

bit 5

SREN: Bit de habilitacin de recepcin sencilla (Single Receive Enable)


Modo asncrono
No importa
Modo sincrnico maestro
1 = Habilita recepcin sencilla
0 = Deshabilita recepcin sencilla
(Este bit es apagado despus que la recepcin es completada)
Modo sincrnico esclavo
No usado en este modo

bit 4

CREN: Bit de habilitacin de recepcin continua (Continuous Receive Enable)

172

Modo asncrono
1 = Habilita recepcin continua
0 = Deshabilita recepcin continua

bit 3

Modo sincrnico
1 = Habilita recepcin continua hasta que el bit CREN sea apagado
(el bit CREN se sobrepone al bit SREN)
0 = Deshabilita recepcin continua
No implementado: Ledo como 0

bit 2

FERR: Bit de error de estructura (Framing Error)


1 = Error de estructura (Framing Error)
(Puede ser actualizado leyendo el registro RCREG y recibiendo el prximo byte vlido)
0 = Ningn error de paridad

bit 1

OERR: Bit de error de desbordamiento (Overrun Error)


1 = Error de desbordamiento (Overrun error) (Es apagado, apagando el bit CREN)
0 = Ningn error de desbordamiento

bit 0

RX9D: 9 bit del dato recibido. Puede ser el bit de paridad


R = Bit de lectura
W = Bit de escritura
U = Bit no implementado, ledo como 0

- n = Valor al arranque (reset) POR

Generador del Baud Rate del USART (Baud Rate Generator) (BRG)
El BGR soporta los modos asncrono y sincrnico del mdulo USART y corresponde a un
generador de bauds (Baud Rate) de 8 bits dedicado. El registro SPBRG controla el periodo de
un temporizador (timer) de 8 bits corriendo libremente. En modo asncrono, el bit BRGH
(TXSTA<2>) tambin controla la relacin de bauds. En modo sincrnico el bit BRGH
(TXSTA<2>) es ignorado. La tabla 17.1 muestra la frmula para calcular la relacin de bauds
para diferentes modos del USART y la cual nicamente aplica en modo maestro (reloj interno).
Dada la relacin de bauds y la frecuencia del oscilador FOSC, usando la frmula de la tabla 17.1
podr ser calculado el valor entero ms cercano para el registro SPBRG, donde X es el valor
en el registro SPBRG (0 a 255). A partir de esto, el error en la relacin de bauds podr ser
determinado.
Tabla 17.1

Frmula para calcular la relacin de bauds (Baud Rate)

El ejemplo 17.1 muestra el clculo del error en la relacin de bauds (Baud Rate) para las
siguientes condiciones:
FOSC = 16 MHz
Deseada Baud Rate = 9600
BRGH = 0
SYNC = 0

173

Ejemplo 17.1 Clculo del error de la relacin de bauds

Podra ser ventajoso utilizar la relacin de bauds alta (high baud rate) (BRGH=1) an para
relojes ms lentos. Esto es porque la ecuacin:
FOSC / (16 (X + 1) )
podra reducir el error de la relacin de bauds (baud rate) en algunos casos.
El escribir un nuevo valor al registro SPBRG causar que el temporizador del BRG sea borrado
(cleared). Esto asegurar que el BRG no espere por un sobre-flujo del temporizador antes de
sacar la nueva relacin de bauds (baud rate).
Tabla 17.2

Registros asociados con el generador de Baud Rate

174

Tabla 17.3

Baud Rates para el modo sincrnico

Tabla 17.4

Baud Rates para el modo asncrono (BRGH = 0)

175

Tabla 17.5

Baud Rates para el modo asncrono (BRGH = 1)

El mdulo USART en modo asncrono


En este modo, el mdulo USART utiliza un formato estndar de no regreso a cero (nonreturnto-zero) (NRZ) con un bit de inicio (Start), ocho o nueve bits de dato y un bit de paro (Stop). El
formato ms comn de dato es de 8 bits. Existe un generador de relacin de bauds (baud rate
generator) de 8 bits integrado y dedicado que podr ser utilizado para derivar frecuencias del
oscilador. El receptor y el transmisor del mdulo USART son funcionalmente independientes
pero utilizan el mismo formato y relacin de bauds (baud rate). El generador de relacin de
bauds (baud rate) produce un reloj X16 o X64 de la relacin de corrimiento (shift rate),
dependiendo del bit BRGH (TXSTA<2>). La paridad no es soportada por el hardware pero
puede ser implementada por programa (almacenado como el 9 bit de dato). El modo asncrono
es inactivo durante el estado de reposo (sleep).
El modo asncrono es seleccionado apagando el bit SYNC (TXSTA<4>).
El mdulo USART asncrono consiste de los siguientes elementos:

Generador de relacin de bauds (Baud Rate Generator)


Circuito de muestreo
Transmisor asncrono
Receptor asncrono

Transmisor asncrono del mdulo USART


La figura 17.1 muestra un diagrma de bloques del transmisor del USART. El corazn del
transmisor es el registro de corrimiento (shift register) de transmisin serial (TSR). El registro de
corrimiento obtiene el dato de la memoria (buffer) de lectura/escritura de transmisin, TXREG.
El registro TXREG es cargado con un dato por programa. El registro TSR no ser cargado
hasta que el bit de paro (Stop) del dato previo haya sido transmitido. Tan pronto como el bit de
paro (Stop) haya sido transmitido, el registro TSR ser cargado con el nuevo dato (si esta
disponible) desde el registro TXREG. Una vez que el registro TXREG transfiere el dato al

176

registro TSR (lo cual ocurre en un ciclo TCY), el registro TXREG estar vaco y el bit de bandera
TXIF se encender. Esta interrupcin podr ser habilitada/deshabilitada mediante el
encendido/apagado del bit de habilitacin TXIE. El bit de bandera TXIF se encender
independientemente del estado del bit de habilitacin TXIE y no podr ser apagado por
programa. Este bit ser apagado (reset) nicamente cuando un nuevo dato sea cargado en el
registro TXREG. Mientras que el bit de bandera TXIF indica el estado del registro TXREG, el bit
TRMT (TXSTA<1>) mostrar el estado del registro TSR. El bit de estado TRMT es de solo
lectura, el cual es encendido cuando el registro TSR se encuentre vaco. Ninguna lgica de
interrupcin es conectada a este bit, por lo que el usuario tendr que leer este bit, con el objeto
de determinar si el registro TSR esta vaco.
Nota 1:

El registro TSR no se encuentra mapeado en la memoria de datos por lo que


no es disponible al usuario.

Nota 2:

Cuando el bit TXEN es encendido, el bit de bandera TXIF tambin ser


encendido debido a que la memoria (buffer) de transmisin no esta llena
todava (todava puede moverse un dato a transmitir hacia el registro TXREG).

La transmisin ser habilitada encendiendo el bit de habilitacin TXIE (TXSTA<5>). La


transmisin no ocurrir hasta que el registro TXREG haya sido cargado con un dato y el
generador de relacin de bauds (baud rate) se encuentre produciendo un reloj (figura 17.1). La
transmisin podr tambin ser iniciada cargando primero el registro TXREG y posteriormente
encendiendo el bit de habilitacin TXEN. Normalmente cuando la transmisin esta a punto de
iniciarse, el registro TSR se encontrar vaco, de manera tal que una transferencia al registro
TXREG resultar en una inmediata transferencia al registro TSR, resultando en un registro
TXREG vaco (ver figura 18.3). Apagando el bit de habilitacin TXEN durante una transmisin
causar que sta sea abortada y se iniciar (reset) el transmisor. Como un resultado, el pin
TX/CK se revertir al estado de alta impedancia (hi-impedance).
Con el objeto de seleccionar una transmisin de 9 bits, el bit de transmisin TX9 (TXSTA<6>),
deber encenderse y el 9 bit deber ser escrito en el bit TX9D (TXSTA<0>). El 9 bit deber
ser escrito antes de escribir el dato de 8 bits en el registro TXREG. Esto es debido a que una
escritura de dato al registro TXREG podra resultar en una inmediata transferencia del dato
hacia el registro TSR (si ste se encontrar vaco). En tal caso, un 9 bit de dato podra ser
cargado en el registro TSR.
Figura 17.1

Diagrma de bloques del transmisor del USART

177

Pasos a seguir cuando se configure una transmisin asncrona:


1. Inicialice el registro SPBRG para una apropiada relacin de bauds (baud rate). Si una
relacin de bauds de alta velocidad es deseable, encienda el bit BRGH.
2. Habilite el puerto serial asncrono apagando el bit SYNC y prendiendo el bit SPEN.
3. Si las interrupciones son deseadas, entonces encienda los bits TXIE, GIE y PEIE.
4. Si el 9 bit de transmisin es deseado, encienda el bit TX9.
5. Habilite la transmisin encendiendo el bit TXEN, el cual tambin encender el bit TXIF.
6. Si una transmisin de 9 bits fu seleccionada, el 9 bit deber ser cargado en el bit
TX9D.
7. Cargue el dato en el registro TXREG (inicio de la transmisin).
Figura 17.2

Transmisin asncrona del maestro

Figura 17.2 Transmisin asncrona del maestro (espalda con espalda)


(back to back)

Tabla 17.6

Registros asociados con la transmisin asncrona

178

Receptor asncrono del mdulo USART


La figura 17.4 muestra un diagrma de bloques del receptor del USART. El dato es recibido
sobre el pin RX/DT y es manejado por el bloque de recuperacin del dato, el cual es un registro
de corrimiento de alta velocidad operando a 16 veces la relacin de bauds (baud rate) y donde
el registro principal de corrimiento serial del receptor opera a la relacin del bit (bit rate) o sea,
a FOSC.
Una vez que el modo asncrono es seleccionado, la recepcin podr ser habilitada
encendiendo el bit CREN (RCSTA<4>).
El corazn del receptor es el registro de corrimiento (shift register) serial del receptor (RSR).
Despus de muestrear, en el pin RX/TX, el bit de paro (Stop), el dato recibido en el registro
RSR es transferido al registro RCREG (si se encuentra vaco). Si la transferencia es completa,
el bit de bandera RCIF se encender. Las interrupciones podrn ser habilitadas/deshabilitadas,
prendiendo/apagando el bit de habilitacin RCIE. El bit de bandera RCIF es solo de lectura y es
apagado por el hardware cuando el registro RCREG ha sido ledo y se encuentra vaco. El
registro RCREG es un registro de doble memoria (double buffered), es decir, posee una
memoria FIFO (First In First Out) doble. Por tanto, es posible recibir dos datos y transferirlos al
FIFO RCREG y un tercer byte iniciando su corrimiento en el registro RSR. A la deteccin de un
bit de paro (Stop) del tercer byte, si el registro RCREG se encuentra todava completo (lleno),
el bit de error de desbordamiento (overrun error), OERR (RCSTA<1>), se encender. La
palabra en el registro RSR se perder. El registro RCREG podr leerse dos veces para
recuperar los dos bytes recibidos en el FIFO. El bit OERR deber ser apagado por programa.
Esto deber hacerse para inicializar (reset) la lgica del receptor (el bit CREN ser apagado y
posteriormente encendido). Si el bit OERR es encendido, la transferencia del registro RSR al
registro RCREG ser inhibida, de manera que es esencial apagar el bit OERR si ste es
prendido. El bit de error de estructura (framing error), FERR (RCSTA<2>), ser encendido si un
bit de paro (Stop) es detectado con un nivel bajo. El bit FERR y el bit del 9 recibido son
almacenados (buffered) de la misma manera que el dato recibido. Leyendo el registro RCREG
cargar el bit RX9D y el bit FERR con nuevos valores, por consiguiente, es esencial para el
usuario lea el registro RCSTA antes de leer el prximo registro RCREG con el objeto de no
perder la vieja (previa) informacin en los bits FERR y RX9D.

179

Figura 17.4

Diagrma de bloques del receptor del USART

Pasos a seguir cuando se configure un receptor asncrono:


1. Inicialice el registro SPBRG para una apropiada relacin de bauds (baud rate). Si una
relacin de bauds de alta velocidad es deseable, encienda el bit BRGH.
2. Habilite el puerto serial asncrono apagando el bit SYNC y prendiendo el bit SPEN.
3. Si las interrupciones son deseadas, entonces encienda los bits RCIE, GIE y PEIE.
4. Si el 9 bit de transmisin es deseado, encienda el bit RX9.
5. Habilite la recepcin encendiendo el bit RCEN.
6. El bit de bandera RCIF ser encendido cuando la recepcin este completa y una
interrupcin ser generada si el bit RCIE estuviese encendido.
7. Lea el registro RCSTA para obtener el 9 bit (si se encuentra habilitado) y determine si
algn error ocurri durante la recepcin.
8. Lea el dato recibido de 8 bits, leyendo el registro RCREG.
9. Si algn error ocurri, borre el error apagando el bit CREN.
Figura 17.5

Recepcin asncrona

180

Muestreo (Sampling)
El dato sobre el pin RX/DT es muestreado tres veces por un circuito de deteccin por mayora
para determinar si un nivel alto o bajo esta presente sobre dicho pin. La figura 17.6 muestra la
forma de onda del circuito de muestreo. El muestreo opera independientemente del estado del
bit BRGH, nicamente la fuente de reloj X16 es diferente.
Figura 17.6

Esquema de muestreo del pin RX, BRGH = 0 o BRGH = 1

Excepcin en algunos microcontroladores


Todos los nuevos microcontroladores usan el esquema de muestreo mostrado en la figura
17.6. Las excepciones en el esquema de muestreo son:

PIC16C63
PIC16C65
PIC16C65A
PIC16C73
PIC16C73A
PIC16C74
PIC16C74A

Estos microcontroladores poseen un circuito que trabaja como sigue. Si el bit BRGH
(TXSTA<2>) esta apagado (a baja relacin de bauds), el muestreo es hecho sobre el sptimo,
octavo y noveno flanco de bajada (falling edge) de un reloj X16 (figura 17.7). Si el bit BRGH
esta encendido (alta relacin de bauds), el muestreo es hecho sobre los tres flancos del reloj
precediendo el segundo flanco de subida (rising edge) despus del primer flanco de bajada
(falling edge) del reloj X4 (figuras 17.8 y 17.9).
Figura 17.7

Esquema de muestreo del pin RX (BRGH = 0)

181

Figura 17.8

Esquema de muestreo del pin RX (BRGH = 1)

Figura 17.9

Esquema de muestreo del pin RX (BRGH = 1)

Tabla 17.7

Registros asociados con la recepcin asncrona

El mdulo USART en modo sincrnico maestro


En el modo sincrnico maestro, el dato es transmitido en una manera de medio duplex (Half
Duplex), es decir, que la transmisin y la recepcin no ocurren al mismo tiempo. Cuando se
transmite un dato, la recepcin es inhibida y viceversa. El modo sincrnico es activado
encendiendo el bit SYNC (TXSTA<4>). Adicionalmente, el bit de habilitacin SPEN
(RCSTA<7>) es prendido con el objeto de configurar los pines de entrada/salida TX/CK y
RX/DT como las lneas CK (clock) y DT (data) respectivamente. El modo maestro indica que el

182

procesador transmite el reloj maestro sobre la lnea CK. El modo maestro es activado
encendiendo el bit CSRC (TXSTA<7>).
Transmisin del mdulo USART en modo sincrnico maestro
La figura 17.1 muestra un diagrma de bloques del transmisor del USART. El corazn del
transmisor es el registro de corrimiento (shift register) de transmisin serial (TSR). El registro de
corrimiento obtiene el dato de la memoria (buffer) de lectura/escritura de transmisin, TXREG.
El registro TXREG es cargado con un dato por programa. El registro TSR no ser cargado
hasta que el bit de paro (Stop) del dato previo haya sido transmitido. Tan pronto como el bit de
paro (Stop) haya sido transmitido, el registro TSR ser cargado con el nuevo dato (si esta
disponible) desde el registro TXREG. Una vez que el registro TXREG transfiera el dato al
registro TSR (lo cual ocurre en un ciclo TCY), el registro TXREG estar vaco y el bit de bandera
TXIF se encender. Esta interrupcin podr ser habilitada/deshabilitada mediante el
encendido/apagado del bit de habilitacin TXIE. El bit de bandera TXIF se encender
independientemente del estado del bit de habilitacin TXIE y no podr ser apagado por
programa. Este bit ser apagado (reset) nicamente cuando un nuevo dato sea cargado en el
registro TXREG. Mientras que el bit de bandera TXIF indica el estado del registro TXREG, el bit
TRMT (TXSTA<1>) mostrar el estado del registro TSR. El bit de estado TRMT es de solo
lectura, el cual es encendido cuando el registro TSR se encuentre vaco. Ninguna lgica de
interrupcin es conectada a este bit, por lo que el usuario tendr que leer este bit, con el objeto
de determinar si el registro TSR esta vaco.
Nota 1:

El registro TSR no se encuentra mapeado en la memoria de datos por lo que


no es disponible al usuario.

Nota 2:

Cuando el bit TXEN es encendido, el bit de bandera TXIF tambin ser


encendido debido a que la memoria (buffer) de transmisin no esta llena
todava (todava puede moverse un dato a transmitir hacia el registro TXREG).

La transmisin ser habilitada encendiendo el bit de habilitacin TXIE (TXSTA<5>). La


transmisin no ocurrir hasta que el registro TXREG haya sido cargado con un dato. El primer
bit de dato ser sacado (shift out) con el prximo flanco de subida (rising edge) del reloj sobre
la lnea CK. El dato de salida ser estable en el flanco de bajada (falling edge) del reloj
sincrnico (figura 17.10). La transmisin tambin podr ser iniciada con la primer carga del
registro TXREG y posteriormente el encendido del bit TXEN. Esto es ventajoso cuando es
seleccionada la relacin de bauds (baud rate) baja, debido a que el generador BRG es
mantenido inactivo (in reset) cuando los bits TXEN, CREN y SREN se encuentran apagados.
Encendiendo el bit TXEN iniciar el generador BRG, creando un reloj de corrimiento
inmediatamente. Normalmente cuando la transmisin es iniciada, el registro TSR se encontrar
vaco, de manera tal que una transferencia al registro TXREG resultar en una transferencia
inmediata al registro TSR, resultando en un registro TXREG vaco. Transferencia back-toback son posibles.
Apagando el bit de habilitacin TXEN durante una transmisin causar que sta sea abortada y
se iniciar (reset) el transmisor. Como un resultado, el pin TX/CK se revertir al estado de alta
impedancia (hi-impedance). Si los bits CREN o SREN se encontraran encendidos durante una
transmisin, sta sera abortada y el pin DT se revertira a su estado de alta impedancia (para
una recepcin). El pin CK permanecer como una salida si el bit CSRC estuviese encendido
(reloj interno). La lgica de transmisor no es inicializada (reset) aunque si desconectada de los
pines. Con el objeto de inicializar (reset) el transmisor, el usuario tendr que apagar el bit
TXEN. Si el bit SREN es encendido (para interrumpir una transmisin y recibir una sola
palabra), entonces despus de que la palabra haya sido recibida, el bit SREN ser apagado y
el puerto serial volver a revertirse para transmitir debido a que el bit TXEN se encuentra
todava encendido. La lnea DT inmediatamente cambiar del modo de recepcin en alta

183

impedancia a modo de transmisin e iniciar el manejo. Para prevenir esto el bit TXEN deber
ser apagado.
Con el objeto de seleccionar una transmisin de 9 bits, el bit de transmisin TX9 (TXSTA<6>),
deber encenderse y el 9 bit deber ser escrito en el bit TX9D (TXSTA<0>). El 9 bit deber
ser escrito antes de escribir el dato de 8 bits en el registro TXREG. Esto es debido a que una
escritura de dato al registro TXREG podra resultar en una inmediata transferencia del dato
hacia el registro TSR (si ste se encontrar vaco). Si el registro TSR se encontraba vaco y el
registro TXREG hubiese sido escrito antes de escribir un nuevo valor al bit TX9D, el valor
presente del bit TX9D sera cargado.
Pasos a seguir cuando se configure una transmisin sincrnica maestra:
1.
2.
3.
4.
5.
6.

Inicialice el registro SPBRG para una apropiada relacin de bauds (baud rate).
Habilite el puerto serial sincrnico maestro encendiendo los bits SYNC, SPEN y CSRC.
Si las interrupciones son deseadas, entonces encienda los bits TXIE.
Si el 9 bit de transmisin es deseado, encienda el bit TX9.
Habilite la transmisin encendiendo el bit TXEN.
Si una transmisin de 9 bits fu seleccionada, el 9 bit deber ser cargado en el bit
TX9D.
7. Cargue el dato en el registro TXREG (inicio de la transmisin).
Tabla 17.8

Registros asociados con la transmisin sincrnica maestra

Figura 17.10

Transmisin sincrnica

184

Figura 17.11

Transmisin sincrnica (a travs de TXEN)

Receptor sincrnico maestro del mdulo USART


La figura 17.4 muestra un diagrma de bloques del receptor del USART. El dato es recibido
sobre el pin RX/DT y es manejado por el bloque de recuperacin del dato, el cual es un registro
de corrimiento de alta velocidad operando a 16 veces la relacin de bauds (baud rate) y donde
el registro principal de corrimiento serial del receptor opera a la relacin del bit (bit rate) o sea,
a FOSC.
Una vez que el modo sincrnico es seleccionado, la recepcin podr ser habilitada
encendiendo el bit CREN (RCSTA<4>) o bien encendiendo el bit SREN (RCSTA<5>). El dato
ser recibido sobre el pin RX/DT con el flanco de bajada (falling edge) del reloj. Si el bit SREN
esta encendido entonces solo una palabra ser recibida. Si el bit CREN esta encendido la
recepcin ser continua hasta que el bit CREN sea apagado. Si los dos bits se encontraran
encendidos, el bit CREN tomara precedencia. Despus de recibir el ltimo bit del dato serial, el
dato recibido en el registro de corrimiento (shift register) (RSR) es transferido al registro
RCREG (si se encontrara vaco). Cuando la transferencia sea completa, el bit de bandera de
interrupcin RCIF ser encendido. Las interrupciones podrn ser habilitadas/deshabilitadas,
prendiendo/apagando el bit de habilitacin RCIE. El bit de bandera RCIF es solo de lectura y es
apagado por el hardware cuando el registro RCREG ha sido ledo y se encuentre vaco. El
registro RCREG es un registro de doble memoria (double buffered), es decir, posee una
memoria FIFO (First In First Out) doble. Por tanto, es posible recibir dos datos y transferirlos al
FIFO RCREG y un tercer byte iniciando su corrimiento en el registro RSR. A la deteccin del
ltimo bit del tercer byte, si el registro RCREG se encuentra todava completo (lleno), el bit de
error de desbordamiento (overrun error), OERR (RCSTA<1>), se encender y la palabra en el
registro RSR se perder. El registro RCREG podr leerse dos veces para recuperar los dos
bytes recibidos en el FIFO. El bit OERR deber ser apagado por programa (apagando el bit
CREN). Si el bit OERR es encendido, la transferencia del registro RSR al registro RCREG ser
inhibida, de manera que es esencial apagar el bit OERR si ste es prendido. El 9 bit recibido
es almacenado (buffered) de la misma manera que el dato recibido. Leyendo el registro
RCREG cargar el bit RX9D con un nuevo valor, por consiguiente, es esencial para el usuario
leer el registro RCSTA antes de leer el prximo registro RCREG con el objeto de no perder la
vieja (previa) informacin en el bit RX9D.
Pasos a seguir cuando se configure un receptor sincrnico maestro:
1.
2.
3.
4.
5.

Inicialice el registro SPBRG para una apropiada relacin de bauds (baud rate).
Habilite el puerto serial sincrnico encendiendo los bits SYNC, SPEN y CSRC.
Asegurase que los bits CREN y SREN se encuentren apagados.
Si las interrupciones son deseadas, entonces encienda los bits RCIE.
Si el 9 bit de transmisin es deseado, encienda el bit RX9.

185

6. Si una recepcin sencilla es requerida, encienda el bit SREN, para recepcin continua
encienda el bit CREN.
7. El bit de bandera RCIF ser encendido cuando la recepcin este completa y una
interrupcin ser generada si el bit RCIE estuviese encendido.
8. Lea el registro RCSTA para obtener el 9 bit (si se encuentra habilitado) y determine si
algn error ocurri durante la recepcin.
9. Lea el dato recibido de 8 bits, leyendo el registro RCREG.
10. Si algn error ocurri, borre el error apagando el bit CREN.
Tabla 17.9 Registros asociados con la recepcin sincrnica maestra

Figura 17.12

Recepcin sincrnica (Modo maestro, SREN)

El mdulo USART en modo sincrnico esclavo


El modo sincrnico esclavo difiere del modo maestro en el hecho de que el reloj de corrimiento
es proporcionado de manera externa sobre el pin TX/CK (en lugar de ser proporcionado
internamente en el modo maestro). Esto permite al dispositivo a transferir o recibir datos
mientras se encuentre en el modo de reposo (sleep). El modo esclavo es activado apagando el
bit CSRC (TXSTA<7>).
Transmisin del mdulo USART en modo sincrnico esclavo
La operacin en los modos sincrnico maestro y esclavo son idnticas excepto en el caso del
modo de reposo (sleep).

186

Si dos palabras son escritas en el registro TXREG y entonces la instruccin SLEEP es


ejecutada, lo siguiente ocurrir:
a)
b)
c)
d)

La primera palabra ser transferida inmediatamente al registro TSR y se transmitir.


La segunda palabra permanecer en el registro TXREG.
El bit de bandera TXIF no se prender.
Cuando la primera palabra haya sido enviada del registro TSR, el registro TXREG
transferir la segunda palabra al registro TSR y el bit de bandera TXIF ahora si se
prender.
e) Si el bit de habilitacin TXIE es encendido, la interrupcin despertar al
microcontrolador de su estado de reposo (sleep) y si las interrupciones globales se
encuentran habilitadas, el programa saltar al vector de interrupcin (0004h).
Pasos a seguir cuando sea configurado un transmisor sincrnico esclavo:
1. Habilite el puerto serial sincrnico esclavo encendiendo los bits SYNC y SPEN y
apagando el bit CSRC.
2. Apague los bits CREN y SREN.
3. Si las interrupciones son deseadas, entonces encienda el bit de habilitacin TXIE.
4. Si una transmisin de 9 bits es deseada, entonces encienda el bit TX9.
5. Habilite la transmisin encendiendo el bit de habilitacin TXEN.
6. Si la transmisin de 9 bits fu seleccionada, el 9 bit deber ser cargado en el bit TX9D.
7. Inicie la transmisin cargando el dato en el registro TXREG.
Tabla 17.10

Registros asociados con la transmisin sincrnica esclava

Recepcin del mdulo USART en modo sincrnico esclavo


La operacin en los modos sincrnico maestro y esclavo son idnticas excepto en el caso del
modo de reposo (sleep). Tambin, el bit SREN es un bit no importa (dont care) en modo
esclavo.
Si la recepcin es habilitada encendiendo el bit CREN, antes de la instruccin SLEEP,
entonces una palabra podr ser recibida durante el estado de reposo (sleep). Una vez recibida
completamente la palabra, el registro RSR transferir el dato al registro RCREG y si el bit de
habilitacin RCIE se encuentra encendido, la interrupcin generar el despertar del
microcontrolador de su estado de reposo (sleep). Si las interrupciones globales se encuentran
habilitadas, el programa saltar al vector de interrupcin (0004h).
Pasos a seguir cuando sea configurado un receptor sincrnico esclavo:

187

1. Habilite el puerto serial sincrnico esclavo encendiendo los bits SYNC y SPEN y
apagando el bit CSRC.
2. Si las interrupciones son deseadas, entonces encienda el bit de habilitacin RCIE.
3. Si una transmisin de 9 bits es deseada, entonces encienda el bit RX9.
4. Habilite la recepcin encendiendo el bit de habilitacin CREN.
5. El bit RCIF ser encendido cuando una recepcin este completa y una interrupcin
ser generada si el bit RCIE se encontrara encendido.
6. Lea el registro RCSTA para obtener el 9 bit (si fu habilitado) y determine si algn
error ocurri durante la recepcin.
7. Lea los 8 bits del dato recibido en el registro RCREG.
8. Si algn error ocurri, borre (clear) el error apagando el bit CREN.
Tabla 17.11

Registros asociados con la recepcin sincrnica esclava

Inicializacin
El ejemplo 17.2 es una rutina de inicializacin para un transmisor/receptor en modo asncrono.
El ejemplo 17.3 es una rutina de inicializacin para un transmisor/receptor en modo sincrnico.
En ambos ejemplos el dato es de 8 bits, y el valor a cargar en el registro SPREG es
dependiente de la relacin de bauds (baud rate) deseado y la frecuencia del oscilador.

Ejemplo 17.2 Transmisor/receptor asncrono

188

Ejemplo 17.3 Transmisor/receptor sincrnico

189

190

18

Referencia de voltaje

El mdulo de referencia de voltaje es generalmente utilizado en conjunto con el mdulo


comparador. Las entradas del mdulo comparador no requieren muy grandes amplificadores
(drives), y por consiguiente la capacidad de amplificacin de la referencia de voltaje es limitada.
El voltaje de referencia es una red en escala de 16 resistencias (16-tap ladder network) que
provee una referencia de voltaje seleccionable. La escala de resistencias es segmentada para
proporcionar 2 rangos de valores de VREF y tienen una funcin de cada de voltaje de
alimentacin (power-down) para conservar el consumo de potencia cuando no se esta usando.
El registro de control VRCON controla la operacin de la referencia, segn se muestra en la
figura 18.1. El diagrma de bloques es mostrado en esta misma figura. Dentro de cada rango,
los 16 pasos son monotonitos (monotonic) (es decir, cada incremento en el cdigo resultar en
un incremento en la salida).
Figura 18.1

Diagrma de bloques de la referencia de voltaje

191

Tabla 18.1

Tpica referencia de voltaje con VDD = 5.0V

Registro de control
Registro VRCON

bit 7

VREN: Habilita VREF


1 = Circuito VREF polarizado (powered on)
0 = Circuito VREF no polarizado (powered down)

bit 6

VROE: Habilita la salida de VREF


1 = VREF es internamente conectada al VREF del mdulo del comparador. Este nivel de
voltaje tambin sale sobre el pin VREF
0 = VREF no es conectada al VREF del mdulo del comparador. Este voltaje es
desconectado del pin VREF

bit 5

VRR: Seleccin del rango VREF


1 = 0V a 0.75 VDD, con pasos de VDD/24
0 = 0.25V a 0.75 VDD, con pasos de VDD/32

bit 4

No implementados: Ledo como 0

bit 3:0 VR3:VR0: Seleccin del valor de VREF


Cuando VRR = 1:
Cuando VRR = 0:

192

R = Bit de lectura
W = Bit de escritura
U = Bit no implementado, ledo como 0

- n = Valor al arranque (reset) POR

Configuracin de la referencia de voltaje


La referencia de voltaje podr proporcionar 16 niveles distintos de voltaje para cada rango.
Las ecuaciones utilizadas para calcular la salida de la referencia de voltaje son como sigue:
Si VRR = 1:

VREF = (VR3:VR0/24) x VDD

Si VRR = 0:

VREF = (VDD x 1/4) + (VR3:VR0/32) x VDD

El tiempo de respuesta de la configuracin de la referencia de voltaje deber ser considerado


cuando sea cambiada la salida VREF. El ejemplo 18.1 muestra como configurar la referencia de
voltaje para un voltaje de salida de 1.25V con VDD = 5.0V.
Generalmente el VREF y el VDD del sistema sern conocidos y se necesitar determinar el valor
a cargar dentro de VR3:VR0. La ecuacin 18.1 muestra como calcular el valor VR3:VR0.
Existir algn error debido a que VR3:VR0 podr ser nicamente un entero, y los niveles VREF y
el VDD debern ser elegidos de tal manera que el resultado no sea mayor a 15.
Ecuacin 18.1 Calculando VR3:VR0

Precisin/Error de la referencia de voltaje


El rango completo de VSS a VDD no podr ser realizado debido a la construccin del mdulo.
Los transistores sobre la parte superior (top) y la parte inferior (bottom) de la red escalada de
resistencias (resistor ladder network) (figura 18.1) retiene a VREF de aproximarse a VSS o VDD.
La referencia de voltaje es un derivado de VDD y por consiguiente la salida VREF cambiar con
fluctuaciones en VDD. La precisin absoluta en la referencia de voltaje podr ser encontrada en
las especificaciones tcnicas contenidas en la hoja de datos (datasheet) del microcontrolador a
usar.
Operacin en el modo de reposo (sleep)
Cuando el microcontrolador sea despertado (wake) de su estado de reposo (sleep) a travs de
una interrupcin o de un tiempo fuera (time-out) en el temporizador de guardia (Watchdog

193

Timer), el contenido del registro VRCON no ser afectado. Para minimizar el consumo de
corriente en el modo de reposo (sleep), la referencia de voltaje deber ser deshabilitada.
Efectos de un arranque (Reset)
Un arranque (reset) en el microcontrolador deshabilitar la referencia de voltaje apagando el
bit VREN (VRCON<7>). Este arranque (reset) tambin desconectar la referencia en el pin
VREF apagando el bit VROE (VRCON<6>) y seleccionar el rango alto de voltaje apagando el
bit VRR (VRCON<5>). Finalmente, los bits de seleccin del valor de VREF, VRCON<3:0>,
tambin sern apagados.
Consideraciones en las conexiones
El mdulo de referencia de voltaje opera independientemente del mdulo del comparador. La
salida del generador de referencia podr ser conectada al pin VREF si el correspondiente bit
TRIS se encuentra encendido y el bit VROE (VRCON<6>) tambin esta encendido. La
habilitacin de la salida de la referencia de voltaje sobre el pin VREF con una seal de entrada
presente incrementar el consumo de corriente. Configurando el pin VREF como una salida
digital con VREF habilitado tambin incrementar el consumo de corriente.
El pin VREF podr ser usado como una simple salida D/A con limitada capacidad de salida
(drive). Debido a esta limitada capacidad, un amplificador (buffer) deber ser utilizado en
conjunto con la salida de la referencia de voltaje para conexiones externas a VREF. La figura
18.2 muestra un ejemplo de la tcnica de amplificacin (buffering).
Figura 18.2

Ejemplo de amplificacin de la salida de la referencia de voltaje

Inicializacin
El ejemplo 18.1 muestra los pasos para configurar el mdulo de referencia de voltaje.

194

Ejemplo 18.1 Configuracin de la referencia de voltaje

195

196

19

Comparador

El mdulo comparador contiene dos comparadores analgicos. Las entradas a los


comparadores son multiplexados con los pines de entrada/salida (I/O). La referencia de voltaje
del microcontrolador (ver el captulo de Referencia de voltaje) tambin podr ser una entrada a
los comparadores.
El registro CMCON, mostrado en la figura 19.1, controla los multiplexores de entrada y de
salida. Un diagrma de bloques del comparador es mostrado en la figura 19.1.
Registro de control
Registro CMCON

bit 7

C2OUT: Bit del indicador de salida del comparador2 (Comparator2 Output Indicator)

bit 6

C1OUT: Bit del indicador de salida del comparador1 (Comparator1 Output Indicator)

bit 5:4 No implementados: Ledos como 0


bit 3

CIS: Bit de conmutacin de la entrada del comparador (Comparator Input Switch)


Cuando CM2:CM0 = 001:
1 = C1

conecta a AN3

0 = C1

conecta a AN0

Cuando CM2:CM0 = 010:


1 = C1

conecta a AN3

C2

conecta a AN2

0 = C1

conecta a AN0

C2

conecta a AN1

bit 2:0 CM2:CM0: Bits de seleccin del modo del comparador (Comparator Mode Select)

197

Ver figura 19.1


R = Bit de lectura
W = Bit de escritura
U = Bit no implementado, ledo como 0

- n = Valor al arranque (reset) POR

Configuracin del comparador


Existen ocho modos de operacin para los comparadores. El registro CMCON es utilizado para
seleccionar el modo. La figura 19.1 muestra los ocho posibles modos. El registro TRIS controla
la direccin del dato de los pines de entrada/salida (I/O) del comparador para cada modo. Si el
modo del comparador es cambiado, el nivel de salida del comparador podra no ser vlido para
el nuevo modo debido al retardo especificado en la hoja de datos (datasheet) del
microcontrolador.
Nota:

Las interrupciones del comparador debern ser deshabilitadas durante un cambio de


modo del comparador, ya que en caso contrario una falsa interrupcin podra ocurrir.

198

Figura 19.1 Modos de operacin de estrada/salida (I/O) del comparador

Operacin del comparador


Un comparador sencillo es mostrado en la figura 19.2 junto con la relacin entre los niveles de
la entrada analgica y la salida digital. Cuando la entrada analgica en VIN+ sea menor que la
entrada analgica en
, la salida del comparador ser un nivel digital bajo. Cuando la

199

entrada analgica en VIN+ sea mayor que la entrada analgica en


, la salida del
comparador ser un nivel digital alto. Las reas sombreadas de la salida de comparador en la
figura 19.2 representan la incertidumbre debido a los desbalances de la entrada (input offsets)
y al tiempo de respuesta.
Referencia del comparador
Una seal de referencia interna o externa podr ser utilizada dependiendo del modo de
operacin del comparador. La seal analgica que est presente en la entrada
ser
comparada con la seal presente en la entrada VIN+, produciendo a la salida del comparador
un nivel digital acorde a la comparacin (figura 19.2).
Figura 19.2

Comparador sencillo

Seal de referencia externa


Cuando una referencia de voltaje externa sea utilizada, el mdulo comparador podr ser
configurado para que opere en este modo. La seal de referencia deber estar entre VSS y VDD,
y podr ser aplicada a cualquier pin del comparador.
Seal de referencia interna
El mdulo comparador tambin permitir seleccionar una referencia de voltaje generada
internamente para los comparadores. El captulo de Referencia de voltaje contiene una
descripcin detallada del mdulo de referencia de voltaje que proporciona esta seal. La seal
de referencia interna ser utilizada cuando los comparadores se encuentren en el modo
CM2:CM0 = 010 (figura 19.1). En este modo, la referencia de voltaje interna es aplicada a la
entrada VIN+ de ambos comparadores.
La referencia de voltaje interna podr ser utilizada en cualquier modo del comparador. Cuando
sea usada en esta manera, el pin de entrada/salida (I/O) VREF podr ser utilizado para
entrada/salida (I/O). La referencia de voltaje es conectada al pin VREF.

200

Tiempo de respuesta del comparador


El tiempo de respuesta corresponde al mnimo tiempo, despus de seleccionar una nueva
referencia de voltaje o fuente de entrada, antes de que la salida del comparador garantice tener
un nivel vlido. Si la referencia interna es cambiada, el mximo tiempo de instalacin (o
asentamiento) (settling time) de la referencia de voltaje interna deber ser considerada cuando
sean usadas las salidas del comparador. De otra manera el tiempo de respuesta mximo del
comparador debera ser usado.
Salidas del comparador
Las salidas del mdulo comparador son ledas a travs del registro CMCON. Estos bits son
nicamente de lectura. Las salidas del mdulo comparador tambin podrn ser directamente
conectadas a los pines de entrada/salida (I/O). Cuando CM2:CM0 = 110, los multiplexores en el
trayecto de salida de los pines de entrada/salida (I/O) conmutarn y la salida de cada pin ser
la salida no-sincronizada del comparador. La incertidumbre de cada uno de los comparadores
es relacionada con el desbalance del voltaje de entrada (input offset voltage) y el tiempo de
respuesta proporcionado en las especificaciones tcnicas. La figura 19.3 muestra un diagrma
de bloques de la salida del comparador.
Los bits TRIS todava funcionarn como los habilitadores/deshabilitadores de la salida para los
pines de entrada/salida (I/O) mientras estn en este modo.
Nota 1:

Cuando se lea el registro del puerto, todos los pines configurados como
entradas analgicas sern ledos como 0. Los pines configurados como
entradas digitales convertirn una entrada analgica de acuerdo a la
especificacin de entrada tipo Schmitt Trigger.

Nota 2:

Un nivel analgico sobre cualquier pin que haya sido definido como una
entrada digital podr causar al amplificador (buffer) de entrada, consumir ms
corriente que la especificada.

201

Figura 19.3

Diagrma de bloques de la salida del comparador

Interrupciones del mdulo comparador


La bandera de interrupcin del comparador ser encendida cuantas veces cambie el valor del
comparador relativo al ltimo valor cargado en los bits CMxOUT. El programa necesitar
mantener la informacin referente al estado de los bits de salida, ledos en CMCON<7:6>, para
determinar el cambio actual que ha ocurrido. El bit CMIF corresponde a la bandera de
interrupcin del mdulo comparador y deber ser apagado por programa. Debido a que
tambin es posible encender este bit, una interrupcin simulada podra ser iniciada.
El bit CMIE y el bit PEIE (INTCON<6>) debern ser encendido para habilitar las interrupciones.
Adicionalmente, el bit GIE tambin deber ser encendido. Si cualquiera de estos bits estuviese
apagado, las interrupciones no seran habilitadas, aunque el bit CMIF si se encendera si
existiera una condicin de interrupcin.
El usuario, en la rutina de servicio a interrupcin, podr apagar la interrupcin de la siguiente
manera:
a) Leyendo o escribiendo en el registro CMCON.
b) Apagando el bit de bandera CMIF.
Una condicin de interrupcin continuar encendiendo el bit de bandera CMIF. Leyendo el
registro CMCON terminar con la condicin de interrupcin y permitir ser apagado el bit de
bandera de interrupcin CMIF.

202

Operacin del comparador en el modo de reposo (sleep)


Cuando un comparador se encuentre activo y el microcontrolador sea puesto en el modo de
reposo (sleep), el comparador permanecer activo y las interrupciones funcionarn si stas se
encuentran habilitadas. Esta interrupcin (si se encuentra habilitada) despertar (wake up) al
microcontrolador de su estado de reposo (sleep). Mientras el comparador se encuentre
energizado (power-up) cada comparador que se encuentre operando, consumir una corriente
adicional de acuerdo a las especificaciones del comparador. Para minimizar el consumo de
potencia mientras se encuentre en el modo de reposo (sleep), los comparadores debern ser
apagados, poniendo CM2:CM0 = 111, antes de entrar al modo de reposo (sleep). Si el
microcontrolador es despertado del estado de reposo, el contenido del registro CMCON no se
afectar.
Efectos de una condicin de arranque (Reset)
Una condicin de arranque (reset) forzar al registro CMCON a su estado de arranque (reset).
Es decir, forzar al mdulo comparador a la condicin de CM2:CM0 = 000. Esto asegurar que
todas las entradas potenciales sean entradas analgicas. La corriente del microcontrolador
ser minimizada cuando las entradas analgicas estn presentes al momento de la condicin
de arranque (reset). Los comparadores sern desactivados (power-down) durante el intervalo
del arranque (reset).
Consideraciones de conexin de las entradas analgicas
Un circuito simplificado para una entrada analgica es mostrado en la figura 19.4. Debido a que
los pines analgicos son conectados a la salida digital, stos tendrn diodos polarizados
inversamente a VDD y VSS. Por consiguiente, la entrada analgica deber estar entre VDD y VSS.
Si el voltaje de entrada se desviara de este rango por ms de 0.6V en cualquier direccin, uno
de los diodos entrar en conduccin y una condicin denominada latch-up podra ocurrir. Una
impedancia mxima de 10
de la fuente es recomendada para fuentes analgicas.
Figura 19.4

Modelo de la entrada analgica

203

Tabla 19.1

Registros asociados con el mdulo comparador

Inicializacin
El cdigo en el ejemplo 19.1 esboza un ejemplo de los pasos requeridos para configurar el
mdulo comparador de los microcontroladores PIC16C62X. Los pines RA3 y RA4 son
configurados como salida digital mientras que los pines RA0 y RA1 son configurados como
entradas V- y el pin RA2 como entrada V+ para ambos comparadores.
Ejemplo 19.1

Inicializacin del mdulo comparador (PIC16C62X)

204

20

Convertidor A/D de 8 bits

El mdulo convertidor anlogo-a-digital (A/D) (Analog to Digital Converter) podr tener hasta 8
entradas analgicas.
El mdulo A/D permite la conversin de una seal analgica de entrada a su correspondiente
nmero digital de 8 bits. La salida de un circuito de muestreo (sample and hold) es la entrada al
convertidor, la cual genera el resultado mediante aproximaciones sucesivas. La referencia de
voltaje analgico es seleccionable por programa, ya sea al voltaje de alimentacin del
microcontrolador VDD o al nivel de voltaje sobre el pin VREF. El convertidor A/D posee una nica
caracterstica de ser capz de operar mientras el microcontrolador se encuentre en el modo de
reposo (sleep).
El mdulo A/D tiene tres registros:

Registro de resultado A/D (ADRES)


Registro0 de control (ADCON0)
Registro1 de control (ADCON1)

El registro ADCON0, mostrado en la figura 20.1, controla la operacin del mdulo A/D. El
registro ADCON1, mostrado en la figura 20.2, configura las funciones de los pines del puerto.
Los pines de entrada/salida (I/O) podrn ser configurados como entradas analgicas (uno de
estos pines podr ser una referencia de voltaje) o como entrada/salida (I/O) digital. La figura
20.1 muestra el diagrma a bloques del mdulo A/D.

205

Figura 20.1

Diagrma de bloques del mdulo A/D de 8 bits

Registro de control
Registro ADCON0

bit 7:6 ADCS1:ADCS0: Bits de seleccin del reloj del convertidor A/D
(A/D Conversion Clock Select)
00 = FOSC/2
01 = FOSC/8
10 = FOSC/32
11 = FRC (reloj derivado del oscilador RC interno del A/D)
bit 5:3 CHS2:CHS0: Bits de seleccin del canal analgico (Analog Channel Select)
000 = canal0, (AN0)
001 = canal1, (AN1)
010 = canal2, (AN2)
011 = canal3, (AN3)
100 = canal4, (AN4)
101 = canal5, (AN5)
110 = canal6, (AN6)
111 = canal7, (AN7)

206

Nota:

bit 2

Para los modelos que no tengan implementados los 8 canales A/D, la seleccin
de los canales no implementados sern reservados, por lo que no se deber
seleccionar ningn canal no implementado.

GO/DONE: Bit de estado de la conversin A/D (A/D Conversion Status)


Cuando ADON = 1
1 = Conversin A/D en progreso
(Prendiendo este bit inicia la conversin A/D. Este bit es automticamente apagado
por hardware cuando la conversin A/D ha sido completada)
0 = Conversin A/D no en progreso

bit 1

Reservado: Siempre deber mantenerse este bit apagado

bit 0

ADON: Bit de encendido del A/D (A/D ON)


1 = El mdulo del convertidor A/D esta operando
0 = El mdulo del convertidor A/D esta apagado y no consume corriente de operacin
R = Bit de lectura
W = Bit de escritura
U = Bit no implementado, ledo como 0

- n = Valor al arranque (Reset) POR

Registro ADCON1

bit 7:3 No implementado: Ledo como 0


bit 2:0 PCFG2:PCFG0: Bits de control de la configuracin del puerto A/D
(A/D Port Configuration Control)

Nota:

Cuando AN3 sea seleccionada como VREF, la referencia A/D ser el voltaje en el pin
AN3. Cuando AN3 sea seleccionado como una entrada analgica (A), entonces la
referencia de voltaje del A/D ser el VDD del microcontrolador.
R = Bit de lectura
W = Bit de escritura
U = Bit no implementado, ledo como 0

207

- n = Valor al arranque (Reset) POR

Nota 1:

Para cualquier condicin de arranque (reset), los pines multiplexados con


funciones analgicas (ANx) sern forzados a ser entradas analgicas.

Operacin
Cuando la conversin A/D este completa, el resultado ser cargado en el registro ADRES, el bit
GO/DONE (ADCON0<2>) ser apagado y el bit de bandera de interrupcin, ADIF, se
encender.
Despus de que el mdulo haya sido configurado como deseado, la seleccin del canal deber
ser hecha antes de que la conversin sea iniciada. Los canales de entrada analgicos debern
tener sus correspondientes bits TRIS seleccionados como entradas. Para determinar el tiempo
de adquisicin, vea la seccin dedicada a este tpico ms adelante en este captulo. Despus
de que este tiempo de adquisicin haya transcurrido, la conversin podr ser iniciada. Para
hacer una conversin A/D debern seguirse los siguientes pasos:
1. Configure el mdulo A/D:
Configure los pines analgicos, la referencia de voltaje y la entrada/salida (I/O)
digital (ADCON1)
Seleccione el canal A/D de entrada (ADCON0)
Seleccione el reloj de conversin A/D (ADCON0)
Encienda el mdulo A/D (ADCON0)
2. Configure la interrupcin del mdulo A/D (si se desea):
Apague el bit ADIF
Encienda el bit ADIE
Encienda el bit GIE
3. Espere el tiempo de adquisicin requerido
4. Inicie la conversin:
Encienda el bit GO/DONE (ADCON0)
5. Espere a que la conversin sea completada en una de las dos maneras posibles:
Leyendo el bit GO/DONE (ADCON0) hasta que sea apagado
o
Esperando una interrupcin A/D
6. Lea el resultado del A/D en el registro ADRES, apague el bit ADIF si es requerido
7. Para la prxima conversin, vaya al paso 1 o paso 2 como sea requerido. El tiempo de
conversin A/D por bit es definida como TAD. Un tiempo de espera mnimo de 2TAD ser
requerido antes de que la prxima adquisicin inicie.
La figura 20.2 muestra la secuencia de conversin y los trminos que son empleados. El
tiempo de adquisicin es el tiempo en que el capacitor de captura (holding capacitor) es
conectado al nivel de voltaje externo (a muestrear). Posteriormente existir el tiempo de
conversin de 10 TAD, el cual es iniciado en el momento en que bit GO es encendido. La suma
de estos dos tiempos corresponde al tiempo de muestreo (sampling time). Existe un tiempo de
adquisicin mnimo que asegurar que el capacitor de captura sea cargado a un nivel que
proporcionar la precisin deseada para la conversin A/D.

208

Figura 20.2

Secuencia de conversin A/D

Requerimientos de la adquisicin A/D


Para que el convertidor A/D encuentre la precisin especificada, al capacitor de captura
(holding capacitor) (CHOLD) se le deber permitir cargarse completamente al nivel de voltaje
existente en el canal de entrada. El modelo de la entrada analgica es mostrado en la figura
20.3. La impedancia de la fuente (source impedance) (RS) y la impedancia del interruptor de
muestreo (sampling switch impedance) (RSS) afectan directamente el tiempo requerido para
cargar el capacitor CHOLD. La impedancia del interruptor de muestreo vara con respecto al
voltaje de alimentacin del microcontrolador (VDD) (figura 20.3). La impedancia mxima
recomendada para fuentes analgicas es de 10 K . Despus de que el canal analgico de
entrada sea seleccionado (cambiado), la adquisicin deber ser hecha antes de que la
conversin pueda ser iniciada.
Para calcular el tiempo de adquisicin mnimo, podr ser utilizada la ecuacin 20.1. Esta
ecuacin asume que se usar un error de LSB (512 pasos para el A/D). El error de LSB
ser el mximo error permitido para que el A/D encuentre la resolucin especificada.
Ecuacin 20.1 Tiempo de adquisicin

209

Ecuacin 20.2 Tiempo mnimo de cargado A/D

El ejemplo 20.1 muestra el clculo del tiempo de adquisicin mnimo requerido TACQ. Este
clculo esta basado asumiendo lo siguiente:

Ejemplo 20.1

Calculando el tiempo de adquisicin mnimo requerido

Nota 1:

La referencia de voltaje (VREF) no tiene efecto sobre la ecuacin debido a que


se cancela consigo misma.

Nota 2:

El capacitor de captura (holding capacitor) (CHOLD) no es descargado despus


de cada conversin.

Nota 3:

La impedancia mxima recomendada para fuentes analgicas es de 10 K


Esto es requerido para encontrar la especificacin de fuga del pin.

Nota 4: Despus de que una conversin haya sido completada, un retardo de 2.0 TAD deber
transcurrir antes de que una adquisicin pueda empezar otra vez. Durante este tiempo el
capacitor de captura no es conectado al canal de entrada seleccionado.

210

Figura 20.3

Modelo de la entrada analgica

Seleccionando el reloj de conversin A/D


El tiempo de conversin A/D por bit es definido como TAD. La conversin A/D requiere de 9.5
TAD por 8 bits de conversin. La fuente del reloj de conversin A/D es seleccionable por
programa. Las cuatro posibles opciones para TAD son:

2 TOSC
8 TOSC
32 TOSC
Oscilador RC interno

Para lograr correctas conversiones A/D, el reloj de conversin A/D (TAD) deber ser
seleccionado para asegurar un tiempo mnimo TAD de 1.6
para todos los modelos.
Las tablas 20.1 y 20.2 muestran los tiempos TAD resultantes derivados de la frecuencia de
operacin del microcontrolador y la fuente de reloj A/D seleccionada.
Tabla 20.1

TAD contra la frecuencia de operacin del microcontrolador

211

Configurando los pines del puerto analgico


El registro ADCON1 y su correspondiente registro TRIS controlarn la operacin de los pines
del puerto A/D. Estos pines que son deseados a ser entradas analgicas debern tener
encendidos sus bits TRIS correspondientes (entrada). Si el bit TRIS estuviese apagado
(salida), sera convertido el nivel de salida digital (VOH o VOL).
La operacin A/D es independiente del estado de los bits CHS2:CHS0 y los bits TRIS.
Nota 1:

Cuando sea ledo el registro del puerto, todos los pines configurados como
canales de entrada analgicos sern ledos como 0. Los pines configurados
como entradas digitales convertirn una entrada analgica. Niveles analgicos
sobre una entrada digitalmente configurada no afectarn la precisin de la
conversin.

Nota 2:

Niveles analgicos sobre cualquier pin configurado como entrada digital


(incluyendo los pines AN7:AN0), podran causar que el amplificador (buffer) de
entrada consuma una corriente que se encuentre fuera de las especificaciones
del microcontrolador.

Conversiones A/D
El ejemplo 20.2 muestra como ejecutar una conversin A/D. Los pines de entrada/salida (I/O)
debern ser configurados como entradas analgicas. La referencia analgica (VREF) ser el
voltaje de alimentacin del microcontrolador VDD. Las interrupciones A/D sern habilitadas y el
reloj de conversin A/D ser FRC. La conversin A/D ser ejecutada sobre el canal AN0.
Nota:

El bit GO/DONE no debera ser encendido en la misma instruccin que enciende el


A/D, debido a los requerimientos del tiempo de adquisicin requeridos.

Apagando el bit GO/DONE durante una conversin A/D, el mdulo abortar dicha conversin.
El registro ADRES no sera actualizado con la muestra parcialmente completada, es decir, el
registro ADRES continuar conteniendo el valor de la ltima conversin completada (o el ltimo
valor escrito en el registro ADRES). Despus de que la conversin A/D sea abortada, un
tiempo de espera de 2 TAD ser requerido antes de que la prxima adquisicin sea iniciada.
Despus de este tiempo de espera (2 TAD), una adquisicin ser automticamente iniciada
sobre el canal seleccionado.

212

Ejemplo 20.2 Haciendo una conversin A/D

Figura 20.4

Ciclos TAD de una conversin A/D

213

Figura 20.5

Diagrma de flujo de la operacin A/D

Cambio (trade-off) de ms rpida conversin menor resolucin


No todas las aplicaciones requieren de un resultado con 8 bits de resolucin sino que en lugar
de eso podran requerir de un tiempo de conversin ms rpido. El mdulo A/D permite al
usuario hacer el cambio o trueque (trade-off) de la velocidad de conversin a resolucin.
Independientemente de la resolucin requerida, el tiempo de adquisicin ser el mismo. Para
aumentar la velocidad de conversin, la fuente del reloj del mdulo podra ser conmutado
(switched) tal que el tiempo TAD viole el mnimo tiempo especificado (ver las especificaciones
elctricas). Una vez que el tiempo TAD viole el mnimo tiempo especificado, todos los bits del
resultado A/D siguientes no sern vlidos. Las fuentes de reloj podrn nicamente ser
conmutadas (switched) entre las tres versiones de oscilador (no pueden ser conmutadas de/a
RC). La ecuacin para determinar el tiempo antes de que el oscilador pueda ser conmutado
(switched) es como sigue:
Tiempo de conversin =
Donde:
N = nmero de bits de resolucin requerida.
Debido a que TAD esta basado en el oscilador del microcontrolador, el usuario deber utilizar
algn mtodo (un temporizador (timer), una iteracin por programa (software loop), etc.) para
determinar cuando podr ser cambiado el oscilador A/D. El ejemplo 20.3 muestra una
comparacin del tiempo requerido para una conversin de 4 bits de resolucin contra una
conversin de 8 bits. El ejemplo es para un microcontrolador operando a 20 MHz (el reloj A/D
es programado para 32 TOSC), y asume que inmediatamente despus de 5 TAD, el reloj A/D ser

214

programado para 2 TOSC. El 2 TOSC viola el tiempo mnimo TAD debido a que los ltimos cuatro
bits no sern convertidos a valores correctos.
Ejemplo 20.3

Tiempos de conversin de 4 bits contra 8 bits

Operacin A/D durante el modo de reposo (sleep)


El mdulo A/D puede operar durante el modo de reposo (sleep). Esto requerir que la fuente de
reloj A/D sea puesta como RC (ADCS1:ADCS0 = 11). Cuando la fuente de reloj RC sea
seleccionada, el mdulo A/D esperar un ciclo de instruccin antes de iniciar la conversin.
Esto permitir que la instruccin SLEEP sea ejecutada, lo cual eliminar todo el ruido de la
conmutacin digital interna de la conversin. Cuando la conversin haya sido completada, el bit
GO/DONE se apagar y el resultado ser cargado en el registro ADRES. Si las interrupciones
A/D no estuvieran habilitadas, entonces el mdulo A/D sera apagado (para conservar la
potencia), aunque el bit ADON permaneciera encendido.
Cuando la fuente de reloj A/D tuviera otra opcin (no la de RC), la instruccin SLEEP causara
que la actual conversin fuese abortada y el mdulo A/D se apagara, aunque el bit ADON
permaneciera encendido.
Apagando el A/D pondra al mdulo A/D en su estado de ms bajo consumo de corriente.
Nota:

Para que el mdulo A/D opere en el modo de reposo (sleep), la fuente de reloj A/D
deber ser puesta como RC (ADCS1:ADCS0 = 11). Para ejecutar una conversin A/D
en el modo de reposo (sleep), el bit GO/DONE deber ser encendido, seguido de la
instruccin SLEEP.

Precisin/Error del A/D


En sistemas donde la frecuencia del microcontrolador sea baja, es preferible que utilice el reloj
A/D en la opcin RC. Con frecuencias moderadas a altas, el tiempo TAD debera ser derivado
del oscilador del microcontrolador.
La precisin absoluta especificada por el convertidor A/D incluye la suma de todas las
contribuciones para la cuantificacin del error (quantization error), el error integral (integral
error), el error diferencial (differential error), el error a completa escala (full scale error), el error
por desbalance (offset error) y monotonicidad (monotonicity). Es definido como la mxima
desviacin de una transicin actual contra una transicin ideal para cualquier cdigo. El error
absoluto del convertidor A/D es especificado a < 1 LSb para VDD = VREF (sobre el rango
operativo especificado). Sin embargo, la precisin del convertidor A/D ser degradada
conforme VDD diverja de VREF.

215

Para un rango de entradas analgicas dado, el cdigo digital de salida ser el mismo. Esto es
debido a la cuantificacin de la entrada analgica a un cdigo digital. El error de cuantificacin
es tpicamente LSb y es inherente al proceso de conversin anlogo a digital. La nica
manera de reducir el error de cuantificacin es incrementando la resolucin del convertidor A/D.
El error por desbalance (offset error) mide la primera transicin actual del cdigo contra la
primera transicin ideal de un cdigo.
El error por desbalance (offset error) genera un corrimiento (shift) en la funcin de transferencia
entera. El error por desbalance (offset error) podr ser calibrado fuera de un sistema o
introducido a un sistema a travs de la interaccin de la corriente total de fuga y la impedancia
de la fuente en la entrada analgica.
El error de ganancia (gain error) mide la desviacin mxima de la ltima transicin actual y la
ltima transicin ideal ajustada por el error de ganancia (gain error). Este error aparece como
un cambio en la pendiente de la funcin de transferencia. La diferencia en el error de ganancia
a un error de escala completa es que a escala completa no toma el error de desbalance (offset
error) en el conteo. El error de ganancia (gain error) puede ser calibrado por programa.
El error de linealidad se refiere a la uniformidad de los cambios de cdigo. Los errores de
linealidad no pueden ser calibrados fuera del sistema. El error de no-linealidad integral mide la
transicin del cdigo actual contra la transicin del cdigo ideal ajustado por el error de
ganancia (gain error) para cada cdigo.
La no-linealidad diferencial mide el ancho del cdigo mximo actual contra el ancho del cdigo
ideal. Esta medida no es ajustada.
En sistemas donde la frecuencia del microcontrolador es baja, es preferible utilizar el reloj A/D
con la opcin RC. A frecuencias moderadas y altas, TAD deber ser derivado del oscilador del
microcontrolador. TAD no deber violar el mnimo y deber ser minimizado para reducir
inexactitudes debido al ruido del capacitor de muestreo.
En sistemas en donde el microcontrolador entrar en el modo de reposo (sleep) despus de
iniciar la conversin A/D, la seleccin de la fuente de reloj RC es requerida. En este modo, el
ruido digital de los mdulos en reposo (sleep) es eliminado. Este mtodo proporciona mayor
exactitud.
Efectos de una condicin de arranque (reset)
Una condicin de arranque (reset) forzar a todos los registros a su estado de arranque (reset).
Esto forzar que el mdulo A/D se apague, y cualquier conversin ser abortada. El valor
contenido en el registro ADRES no ser modificado por una condicin de arranque (power-on
reset) POR. El registro ADRES contendr un dato desconocido despus de una condicin de
arranque (power-on reset) POR.
Uso del disparador (trigger) del mdulo CCP
Una conversin A/D podra ser iniciada mediante el disparo de un evento especial (special
event trigger) de un mdulo CCP. Esto requiere que los bits CCPxM3: CCPxM0
(CCPxCON<3:0>) sean programados como 1011 y que el mdulo A/D se encuentre habilitado
(bit ADON encendido). Cuando el disparo (trigger) ocurra, el bit GO/DONE se encender,
iniciando la conversin A/D e iniciando (reset) a cero el contador del Timer1. El Timer1 es
iniciado (reset) para repetir automticamente el periodo de adquisicin A/D con un mnimo
nmero de instrucciones del programa (moviendo el registro ADRES a la localidad deseada). El

216

canal de entrada analgica apropiada deber ser seleccionado y la mnima adquisicin hecha
antes de que el disparo del evento especial encienda el bit GO/DONE (inicio de una
conversin).
Si el mdulo A/D no estuviera habilitado (el bit ADON apagado), entonces el disparo del
evento especial sera ignorado por el mdulo A/D, pero si se iniciara (reset) el contador del
Timer1.
Consideraciones de conexin
Si el voltaje de entrada excediera los valores acotados (VSS o VDD) por ms de 0.3V, entonces
la precisin de la conversin estara fuera de especificacin.
Un filtro RC externo podra ser agregado en ocasiones para evitar que la seal de entrada se
viera cortada en fragmentos (anti-aliasing). La componente R deber ser seleccionada para
asegurar que la impedancia total de la fuente no exceda la recomendacin de10
. Cualquier
componente externa conectada (va alta impedancia) a un pin de entrada analgica (capacitor,
diodo zener, etc) deber tener muy pequea corriente de fuga hacia el pin.
Funcin de transferencia
La funcin de transferencia ideal del convertidor A/D es como sigue: La primera transicin
ocurre cuando el voltaje analgico de entrada (VAIN) es 1 LSb (o VREF analgico / 256) (figura
20.6).
Figura 20.6

Funcin de transferencia A/D

217

Inicializacin
El ejemplo 20.4 muestra la inicializacin del mdulo A/D para el microcontrolador modelo
PIC16C74A.
Ejemplo 20.4 Inicializacin A/D (para PIC16C74A)

218

21 Watchdog Timer y modo Sleep

El temporizador de guardia (Watchdog Timer) (WDT) corre libremente con un oscilador RC


interno y el cual no requiere de ninguna componente externa. El diagrma de bloques es
mostrado en la figura 21.1. Este oscilador RC se encuentra separado del oscilador RC del
microcontrolador del pin OSC1/CLKIN. Esto significa que el temporizador WDT correr, an si
el reloj de los pines OSC1 y OSC2 haya sido detenido en su operacin, por ejemplo, cuando se
ejecute la instruccin SLEEP.
El temporizador de guardia WDT es habilitado/deshabilitado mediante un bit de configuracin
del microcontrolador. Si el temporizador WDT es habilitado, la ejecucin del programa podra
no deshabilitar esta funcin.
Figura 21.1

Diagrma de bloques del temporizador de guardia WDT

Registro de control
El registro OPTION_REG es un registro de lectura y escritura, el cual contiene varios bits de
control para configurar el pre-escalador de TMR0 / post-escalador de WDT, las interrupciones
externas INT, el temporizador TMR0 y las resistencias pull-up sobre el puerto PORTB.

219

Nota:

Para conseguir una asignacin del pre-escalador para el registro TMR0 de 1:1, deber
asignar el pre-escalador al temporizador WDT.
Registro OPTION_REG

(1)

bit 7

RBPU : Bit de habilitacin de las resistencias pull-up (Weak Pull-up Enable)


1 = Las resistencias de pull-up son deshabilitadas
0 = Las resistencias de pull-up son habilitadas (valor del latch individual)

bit 6

INTEDG: Bit de seleccin del flanco de interrupcin (Interrupt Edge Select)


1 = Interrupcin con el flanco de subida (rising edge) del pin INT
0 = Interrupcin con el flanco de bajada (falling edge) del pin INT

bit 5

T0CS: Bit de seleccin de la fuente de reloj para TMR0 (TMR0 Clock Source Select)
1 = Transicin sobre el pin T0CKI
0 = Reloj interno de ciclo de instruccin (CLKOUT)

bit 4

T0SE: Bit de seleccin del flanco de la fuente de reloj para TMR0


(TMR0 Source Edge Select)
1 = Incremento con la transicin alto-a-bajo sobre el pin T0CKI
0 = Incremento con la transicin bajo-a-alto sobre el pin T0CKI

bit 3

PSA: Bit de asignacin del pre-escalador (Prescaler Assignment)


1 = El pre-escalador es asignado al temporizador de guardia WDT
0 = El pre-escalador es asignado al mdulo Timer0

bit 2:0 PS2:PS0: Bit de seleccin de la relacin pre-escalador TMR0 / post-escalador WDT
(TMR0 Prescaler / WDT Postscaler Rate Select)

R = Bit de lectura
W = Bit de escritura
U = Bit no implementado, ledo como 0
Nota:

- n = Valor al arranque (Reset) POR

Algunos modelos llaman este bit GPPU. Los modelos que tienen
el bit RBPU, tienen las resistencias de pull-up sobre el puerto PORTB, mientras que
los modelos que tienen el bit GPPU, tienen las resistencias de pull-up sobre el puerto
GP.

220

Operacin del temporizador de guardia (Watchdog Timer) WDT


Durante la operacin normal, un tiempo fuera (time-out) en el temporizador WDT generar
una condicin de arranque (RESET). Si el microcontrolador se encontrara en el modo de
reposo (sleep), un tiempo fuera (time-out) en el temporizador WDT despertara al
microcontrolador y continuara su operacin normal. Esto es conocido como un despertar del
temporizador WDT (WDT wake-up). El temporizador WDT puede ser permanentemente
deshabilitado apagando el bit de configuracin WDTE.
La asignacin del post-escalador es completamente bajo control del programa, es decir, esta
puede ser cambiada al vuelo (on the fly) durante la ejecucin del programa.
Nota:

Para prevenir una indeseada condicin de arranque (reset), la secuencia de


instrucciones mostrada en el ejemplo 21.1 deber ser ejecutada cuando sea cambiada
la asignacin del pre-escalador del Timer0 al post-escalador del WDT. Esta secuencia
deber ser seguida an si el temporizador WDT se encuentra deshabilitado.

En el ejemplo 21.1, la primera modificacin del registro OPTION_REG no necesitar ser


incluida si el valor final del pre-escalador fuese otro que 1:1. Si el valor del pre-escalador fuese
1:1, entonces un valor temporal del pre-escalador (distinto a 1:1), y el valor final del preescalador es puesto en la ltima modificacin del registro OPTION_REG. Esta secuencia
deber ser seguida debido a que el valor en el pre-escalador de TMR0 es desconocido y est
siendo usada por el post-escalador de WDT. Si el registro OPTION_REG fuera cambiado sin
esta secuencia de cdigo, el tiempo antes de que generara una condicin de arranque (reset)
el temporizador WDT, sera desconocido.
Ejemplo 21.1 Cambiando el pre-escalador

Para cambiar el pre-escalador del temporizador WDT al mdulo Timer0 utilice la secuencia
mostrada en el ejemplo 21.2

Ejemplo 21.2 Cambiando el pre-escalador

221

Periodo del temporizador WDT


El temporizador WDT tiene un periodo de tiempo-fuera (time-out) nominal de 18 ms (sin postescalador). Este periodo vara con la temperatura, las variaciones en el voltaje de alimentacin
VDD, as como variaciones en el proceso. Si se deseara un periodo de tiempo-fuera (time-out)
mayor, podra asignarse al temporizador WDT un post-escalador con una relacin de divisin
de hasta 1:128, bajo control de programa, mediante el registro OPTION_REG. Entonces,
periodos de hasta 2.3 segundos podran ser realizados.
Las instrucciones CLRWDT y SLEEP borrarn el temporizador WDT y el post-escalador (si
ste fuese asignado al WDT) previniendo la ocurrencia de una condicin de tiempo fuera que
generara una condicin de arranque (reset).
El bit TO en el registro STATUS ser apagado despus de la ocurrencia de un tiempo fuera
del temporizador WDT, ya sea un arranque o un despertar (WDT Reset and WDT wake-up).
Consideraciones en la programacin del temporizador WDT
Es importante mencionar que deber ser tomado en cuenta que bajo las condiciones del peor
de los casos (worst case conditions) (VDD = mnimo, Temperatura = mxima, Post-escalador de
WDT mximo) podra tomar varios segundos antes de que una condicin de tiempo fuera del
WDT ocurra.
Nota:

Cuando el post-escalador es asignado al temporizador WDT, siempre deber


ejecutarse una instruccin CLRWDT antes de cambiar el valor del post-escalador, de
otra manera una condicin de arranque (reset) podra ocurrir.
Tabla 21.1

Resumen de registros del temporizador WDT

Modo de reposo (sleep) (Baja potencia) (Power-Down)


El modo de reposo (sleep) (baja potencia) (Power-Down) es un modo en donde el
microcontrolador es puesto en el estado de ms bajo consumo de corriente. El oscilador es
apagado, de manera que ningn reloj del sistema est presente en el microcontrolador. Para
entrar en el modo de reposo deber ejecutarse la instruccin SLEEP.
Si se encuentra habilitado, el temporizador WDT ser borrado (cleared) pero se mantendr
corriendo, el bit PD en el registro STATUS ser apagado, el bit TO se encender y el
manejador (driver) del oscilador se apagar. Los puertos de entrada/salida (I/O) mantendrn el
estado que tenan antes de ser ejecutada la instruccin SLEEP (alto, bajo o alta-impedancia).
Para obtener el ms bajo consumo de corriente en este modo, todos los pines de
entrada/salida (I/O) debern estar a VDD o VSS, con ningn circuito externo consumiendo
corriente de los pines y los mdulos especificados a tener un consumo de corriente delta en el
modo de reposo debern ser deshabilitados. Los pines de entrada/salida (I/O) que son
entradas de alta-impedancia debern ser jalados alto (pull-up) o bajo (pull-down) externamente
para prevenir corrientes de conmutacin (switching currents) causadas por entradas flotantes.
La entrada T0CKI tambin deber estar a VDD o VSS para tener el ms bajo consumo de

222

corriente. La contribucin de las resistencias de pull-up del puerto PORTB deberan ser
consideradas.
El pin MCLR deber estar en un nivel lgico alto (VIHMC).
Algunas caractersticas del microcontrolador que consuman una corriente delta en el modo de
reposo (sleep) sern habilitadas/deshabilitadas mediante los bits de configuracin del
microcontrolador. Estos incluyen los circuitos de los mdulos: temporizador de guardia
(Watchdog Timer) (WDT) y del Brown-out Reset (BOR).
Despertar del modo de reposo (Wake-up from sleep)
El microcontrolador podr despertar de su modo de reposo mediante uno de los siguientes
eventos:
1. Cualquier condicin de arranque (reset).
2. El despertar del temporizador de guardia WDT.
3. Cualquier mdulo perifrico que pueda ser encendida su bandera de interrupcin
mientras se encuentra en modo de reposo, tales como:

Pin de interrupcin externa INT


Un cambio sobre el pin del puerto
Comparadores
A/D
Timer1
SSP
Captura

El primer evento iniciar (reset) el microcontrolador despus de despertar. No obstante los dos
eventos ms recientes despertarn al microcontrolador y entonces resumirn la ejecucin del
programa. Los bits TO y PD en el registro STATUS podrn ser usados para determinar la
causa de la condicin de arranque (reset) del microcontrolador. El bit PD, el cual es prendido al
arranque de encendido (power-up), es apagado cuando la instruccin SLEEP es ejecutada. El
bit TO ser apagado si ocurriese un despertar del temporizador WDT.
Cuando la instruccin SLEEP esta siendo ejecutada, la prxima instruccin (PC + 1) es prebuscada. Para que el microcontrolador despierte a travs de un evento de interrupcin, el
correspondiente bit de habilitacin de interrupcin deber estar encendido (habilitado). El
despertar es independiente del estado que guarde el bit GIE. Si el bit GIE se encontrara
apagado (deshabilitado), el microcontrolador continuara con la ejecucin de la instruccin
posterior a la instruccin SLEEP. Si el bit GIE se encontrara encendido (habilitado), el
microcontrolador ejecutara la instruccin posterior a la instruccin SLEEP y entonces saltara
al vector de interrupcin (0004h). En los casos en donde la ejecucin de la instruccin siguiente
a la instruccin SLEEP no fuese deseable, el usuario deber tener una instruccin NOP
despus de la instruccin SLEEP.
Despertando (wake-up) usando interrupciones
Cuando las interrupciones son globalmente deshabilitadas (GIE apagado) y cualquier fuente de
interrupcin tuviera su bit de habilitacin encendido y su bit de bandera de interrupcin
encendido, uno de los siguientes eventos ocurrir:

Si la interrupcin ocurre antes de la ejecucin de la instruccin SLEEP, sta ser


completada como una instruccin NOP. Por consiguiente, el temporizador WDT y el

223

post-escalador del WDT no sern borrados, el bit TO no ser encendido y el bit PD no


ser apagado.
Si la interrupcin ocurre durante o despus de la ejecucin de la instruccin SLEEP, el
microcontrolador inmediatamente despertar del modo de reposo. La instruccin
SLEEP ser completamente ejecutada antes de despertar. Por consiguiente, el
temporizador WDT y el post-escalador del WDT sern borrados, el bit TO ser
encendido y el bit PD ser apagado.

An si los bits de bandera fueran ledos antes de ejecutar la instruccin SLEEP, podra ser
posible para estos bits, encenderse antes de que la instruccin fuese completada. Para
determinar si una instruccin SLEEP se ejecut, pruebe el bit PD. Si el bit PD est encendido,
la instruccin SLEEP fu ejecutada como una instruccin NOP.
Para asegurar que el temporizador WDT fu borrado, una instruccin CLRWDT debera ser
ejecutada antes de la instruccin SLEEP.
Figura 21.2

Despertar del modo de reposo a travs de interrupcin

224

22

Bits de configuracin

Los bits de configuracin del microcontrolador permiten a cada usuario poner a la medida
(customize) ciertos aspectos del microcontrolador a las necesidades de la aplicacin. Cuando
el microcontrolador es encendido (power-up), el estado de estos bits determinarn los modos
que el microcontrolador usar. Los bits de configuracin son mapeados en la memoria de
programa en la localidad 2007h. Esta localidad no es accesible durante la operacin normal del
microcontrolador (solo podr ser accedida durante el modo de programacin).
Los bits de configuracin podrn ser programados (ledos como 0) o dejados sin programar
(ledos como 1) para seleccionar varias configuraciones del microcontrolador. La habilidad de
poder cambiar estos valores una vez que ha sido programado depender de la tecnologa de la
memoria y del tipo de empaque.
Para microcontroladores con memoria de solamente lectura (Read Only Memory) (ROM), estos
bits son especificados en el tiempo en que es enviado el cdigo para su programacin en
fbrica, por lo que no podrn ser cambiados.
Para microcontroladores programables una sola vez (One Time Programmable) (OTP), una vez
que estos bits son programados (0), estos no podrn ser cambiados.
Para microcontroladores con ventana (EPROM), una vez que estos bits son programados (0),
el microcontrolador deber ser borrado con luz ultravioleta, para poder ser re-programado, ya
que la luz borrar tanto la memoria de programa como los bits de configuracin.
Para microcontroladores con memoria elctricamente programable (FLASH), estos bits podrn
ser borrados y reprogramados.
Nota:

MICROCHIP no recomienda proteger el cdigo para microcontroladores con ventana.

Bits de la palabra de configuracin (Configuration Word Bits)


Estos bits de configuracin especifican algunos de los modos del microcontrolador, y son
programados a travs de un programador de dispositivos especial para este propsito o
mediante el uso de la caracterstica denominada programacin serial montado en el circuito
(In-Circuit Serial Programming) (ICSP). El microcontrolador no ser capz de leer los valores
de estos bits, por lo que deber tenerse mucho cuidado cuando sea seleccionado el modelo del
microcontrolador en el programador de dispositivos. Para informacin adicional, refirase a la
especificacin de programacin del modelo de microcontrolador usado.
Nota 1:

Asegurese siempre que su programador de dispositivos tenga el mismo modelo


seleccionado al que se esta programando.

Nota 2:

MICROCHIP recomienda que el estado de los bits de configuracin deseados


se encuentren integrados en el cdigo fuente del programa de aplicacin. Esto

225

es fcilmente hecho en el ensamblador MPASM mediante el uso de la directiva


CONFIG. (Ver captulo MPASM).
CP1:CP0: Bits de proteccin del cdigo (Code Protection Bits)
11 = Proteccin del cdigo apagado (Code Protection Off)
10 = Ver hoja de datos (datasheet) del modelo
01 = Ver hoja de datos (datasheet) del modelo
00 = Toda la memoria es protegida del cdigo
Nota:

Algunos modelos pueden usar ms o menos bits para determinar la proteccin del
cdigo. Actualmente existen tambin algunos modelos que utilizan nicamente un bit
(CP0). Para estos modelos, la descripcin del bit es:

1 = Proteccin del cdigo apagada (Code Protection Off)


0 = Proteccin del cdigo habilitada (Code Protection On)
DP: Bit de proteccin de la memoria de datos EEPROM
(Data EEPROM Memory Code Protection)
1 = Proteccin del cdigo apagada (Code Protection Off)
0 = Proteccin de la memoria EEPROM habilitada (Code Protection On)
Nota:

Este bit es utilizado cuando un microcontrolador con memoria de programa ROM


tambin tenga memoria de datos EEPROM.

BODEN: Bit de habilitacin del arranque (reset) Brown-out (BOR)


1 = BOR habilitado
0 = BOR deshabilitado
Nota:

Habilitando el arranque (reset) Brown-out (BOR) automticamente se habilitar el


temporizador de encendido (Power-up Timer) (PWRT) independientemente del valor
del bit PWRTE. Asegurese de que el temporizador de encendido (Power-up Timer)
(PWRT) sea habilitado cuando el arranque (reset) Brown-out (BOR) se habilite.

PWRTE: Bit de habilitacin del temporizador de encendido


(Power-up Timer Enable)
1 = PWRT deshabilitado
0 = PWRT habilitado
Nota 1:

Habilitando el arranque (reset) Brown-out (BOR) automticamente se


habilitar el temporizador de encendido (Power-up Timer) (PWRT)
independientemente del valor del bit PWRTE. Asegurese de que el
temporizador de encendido (Power-up Timer) (PWRT) sea habilitado cuando el
arranque (reset) Brown-out (BOR) se habilite.

Nota 2:

Algunos modelos podran tener la polaridad de este bit invertido.

226

MCLRE: Bit de seleccin de la funcin del pin MCLR


(MCLR Pin Function Select)
1 = La funcin del pin es MCLR
0 = La funcin del pin es una entrada/salida (I/O) digital.
MCLR ser internamente conectada a VDD.
WDTE: Bit de habilitacin del temporizador de guardia WDT
(Watchdog Timer Enable)
1 = WDT habilitado
0 = WDT deshabilitado
FOSC1:FOSC0: Bits de seleccin del oscilador (Oscillator Selection)
11 = Oscilador RC
10 = Oscilador HS
01 = Oscilador XT
00 = Oscilador LP
FOSC2:FOSC0: Bits de seleccin del oscilador (Oscillator Selection)
111 = Oscilador EXTRC, con CLKOUT
110 = Oscilador EXTRC
101 = Oscilador INTRC, con CLKOUT
100 = Oscilador INTRC
011 = Reservado
010 = Oscilador HS
001 = Oscilador XT
000 = Oscilador LP
No implementado: Ledo como 1
R = Bit de lectura
W = Bit de escritura
- n = Valor al arranque (reset) POR
Nota:

U = Bit no implementado, ledo como 0


u = Sin cambio del estado programado

La posicin de los bits de configuracin es dependiente del modelo. Refirase a las


especificaciones de programacin para la posicin de los bits. El uso de un
programador de dispositivos de MICROCHIP no requerir conocer la posicin de los
bits.

Directiva de configuracin (CONFIG) del ensamblador MPASM


El ensamblador de MICROCHIP, MPASM, posee una caracterstica interesante que permite
especificar, en el archivo del cdigo fuente, el estado de los bits de configuracin para este
programa. Esto asegura que cuando se programe un microcontrolador para una aplicacin, la
configuracin requerida sea tambin programada. Esto minimiza el riesgo de programar la
configuracin errnea y asombrarse del porque la aplicacin no trabaja adecuadamente.
El ejemplo 22.1 muestra una plantilla para usar la directiva CONFIG.

227

Ejemplo 22.1 Usando la directiva CONFIG, una plantilla del archivo fuente

Los smbolos que actualmente aparecen en el archivo especfico del microcontrolador (Header
File) de MICROCHIP que hacen uso de la directiva CONFIG son mostrados en la tabla 22.1.
Para los smbolos disponibles para el modelo de microcontrolador de inters, refirase al
archivo Include del modelo de microcontrolador MICROCHIP.
Nota:

De acuerdo a la correcta especificacin del modelo (en las directivas LIST y archivo
INCLUDE), se asegurar la correcta polaridad de todos los bits.

228

Tabla 22.1

Smbolos de directivas _CONFIG

Verificacin del programa / Proteccin del cdigo


Si los bits de proteccin del cdigo no han sido programados, la memoria de programa del
microcontrolador podr ser leda para propsitos de verificacin.
Nota:

MICROCHIP no recomienda proteger el cdigo a microcontroladores de ventana.

Microcontroladores con memoria ROM


Cuando un microcontrolador con memoria ROM tenga adicionalmente memoria EEPROM, un
bit adicional de configuracin de cdigo de proteccin ser implementado. El bit de
configuracin de la memoria de programa ser incluido como parte del cdigo enviado a
MICROCHIP para su fabricacin. El bit de configuracin de proteccin de cdigo de la memoria
de datos EEPROM ser programado (en fbrica) con el mismo estado que el bit de proteccin

229

de cdigo de la memoria de programa. Es decir, el bit de proteccin del cdigo de la memoria


de datos EEPROM se programar apagado si el bit de configuracin de proteccin del cdigo
de la memoria de programa est apagado, y el bit de proteccin del cdigo de la memoria de
datos EEPROM ser encendido en todos los otros casos.
En aplicaciones donde el microcontrolador sea protegido del cdigo y la memoria EEPROM
necesite ser programada antes de que la aplicacin pueda ser liberada, esta memoria deber
tener la memoria totalmente borrada. La especificacin de programacin del microcontrolador
detallar los pasos para hacer esto. Los programadores de microcontroladores de MICROCHIP
implementan la secuencia especificada. Una vez que esta secuencia sea completada, la
proteccin del cdigo de la memoria de datos EEPROM ser deshabilitada. Esto permitir que
los datos deseados puedan ser programados dentro del microcontrolador. Despus de
programar el arreglo de la memoria de datos EEPROM, el bit de configuracin de proteccin
del cdigo de la memoria de datos EEPROM podra ser programada como es deseado.
Localidades de identificacin (ID Locations)
Cuatro localidades de memoria (2000h 2003h) son designadas como localidades de
identificacin (ID Locations) donde el usuario podr almacenar cdigos de verificacin
(Checksum) u otros nmeros de cdigo de identificacin. Estas localidades no son accesibles
durante su ejecucin normal, sino nicamente son ledas y escritas en modo de
programacin/verificacin. Es recomendable que nicamente sean usados los cuatro bits
menos significantes de las localidades de identificacin (ID locations).

230

23 Programacin serial (ICSPTM)

Todos los microcontroladores de la serie 12Cxxx y 16Cxxx podrn ser programados de manera
TM
serial (In-Circuit Serial Programming) (ICSP ) estando montados en el circuito final de la
aplicacin. Esto es hecho simplemente con dos lneas, una para reloj y otra para el dato, as
como otras tres lneas adicionales para VDD, VSS y el voltaje de programacin VPP.
La programacin serial es una gran manera de reducir el inventario as como el tiempo de
liberar al mercado un nuevo producto. Ensamblando los productos con un microcontrolador en
blanco, podrn ser almacenados hasta que una orden de produccin haya sido puesta, en cuyo
caso los microcontroladores tendrn que ser programados con la ltima versin del programa
de aplicacin (firmware), probarlos y enviarlos a su destino en muy corto tiempo. Este mtodo
tambin reduce el inventario de desecho debido a viejas versiones del programa. Este tipo de
sistema de manufactura puede facilitar tambin los cambios rpidos de rdenes de clientes.
Mucha gente piensa que al utilizar la programacin serial (ICSP) en microcontroladores tipo
OTP sobre una lnea de ensamble, este dispositivo podr ser programado una sola vez. Sin
embargo, existe un mtodo con el cual un dispositivo OTP pueda ser programado hasta dos
veces dependiendo del tamao del programa de aplicacin (firmware). Este mtodo, explicado
ms adelante, proporciona una forma de actualizar (en el campo) el programa (firmware) de
una manera similar a la usada en una memoria EEPROM o FLASH.
Entrando en el modo de programacin serial (ICSP)
El microcontrolador entrar en el modo de programar/verificar, manteniendo los pines RB6 y
RB7 en un nivel bajo mientras se levanta el pin MCLR (VPP) de VIH a VIHH (ver especificaciones
de programacin) y teniendo el pin VDD en un nivel de voltaje de programacin. El pin RB6
vendr a ser el reloj de programacin y RB7 el dato de programacin. RB6 y RB7 son entradas
Schmitt Trigger en este modo y cuando RB7 se encuentre manejando (driving) un dato, ste
ser una salida CMOS.
Despus de una condicin de arranque (reset), al poner al microcontrolador en el modo de
programar/verificar, el contador de programa (PC) estar apuntando a la localidad 00h,
entonces un comando de 6 bits podr ser proporcionado al microcontrolador. En algunos
comandos se enviar o leer un dato de 14 bits (o 12 bits en algunos modelos), dependiendo si
el comando es una carga (LOAD) o una lectura (READ). Para una informacin detallada,
refirase a las especificaciones tcnicas de programacin del modelo del microcontrolador.
Durante la programacin serial, el circuito del temporizador de guardia WDT ser deshabilitado
de generar una condicin de arranque (reset) en el microcontrolador.
El circuito de aplicacin
El circuito de aplicacin deber ser diseado de tal manera que pueda permitir a todas las
seales de programacin estar directamente conectadas al microcontrolador. La figura 23.1

231

muestra un circuito tpico, que es un punto de partida, para cuando la programacin serial vaya
a ser utilizada. La aplicacin deber contemplar los siguientes aspectos:

El aislamiento del pin MCLR/VPP del resto del circuito


La carga sobre los pines RB6 y RB7
La capacitancia de cada uno de los pines VDD, MCLR/VPP, RB6 y RB7
El voltaje mnimo y mximo de operacin para VDD
El oscilador del microcontrolador
La interfase hacia el programador

El pin MCLR/VPP es normalmente conectado a un circuito RC. La resistencia es conectada a


VDD y un capacitor conectado a VSS (ground). Este circuito pudiera afectar la operacin de la
operacin ICSP dependiendo del tamao del capacitor debido a que el voltaje VPP deber estar
aislado del resto del circuito (en muchos casos una resistencia no es capz de aislar el
circuito). Por lo tanto, es altamente recomendable usar el circuito de la figura 23.1 en caso de
que en la aplicacin exista un circuito RC conectado al pin MCLR/VPP. El diodo deber ser un
dispositivo del tipo Schottky. Otro aspecto con el pin MCLR/VPP es que cuando el
microcontrolador este siendo programado, este pin tendr aplicado un voltaje de
aproximadamente 13V y tambin tierra (ground). Por consiguiente, el circuito de aplicacin
deber estar aislado de este voltaje proporcionado por el programador.
Los pines RB6 y RB7 son utilizados para programar el microcontrolador. RB6 ser la lnea de
reloj mientras que RB7 ser la lnea de dato. RB7 es un pin bi-direccional y ser manejado por
el programador cuando se encuentre programndolo y manejado por el microcontrolador
cuando se encuentre verificndolo. Estos pines debern de ser aislados del resto del circuito de
aplicacin de manera tal que no afecte las seales durante la programacin. Deber tomarse
en consideracin la impedancia de salida del programador cuando se aslen los pines RB6 y
RB7 del resto del circuito. Este circuito aislado deber tomar en cuenta que RB6 ser una
entrada y que RB7 ser bi-direccional (deber ser manejado tanto por el programador como

por el microcontrolador). Por ejemplo, el programador PRO MATE II tiene una impedancia de
salida de
. Si el diseo de la aplicacin lo permitiera, estos pines no deberan ser usados
por la aplicacin. Este no es el caso con muchas aplicaciones de manera que es recomendado
que el diseador evale si estas seales necesiten ser amplificadas (buffered). Como
diseador, se debera considerar que tipo de circuito es recomendado para conectarse a los
pines RB6 y RB7 y entonces tomar una decisin de como aislar estos pines. La figura 23.1 no
muestra ningn circuito para aislar RB6 y RB7 sobre el circuito de aplicacin debido a que esto
es muy dependiente de la aplicacin.
Para simplificar esta interfase con respecto al uso ptimo de estos pines de entrada/salida (I/O)
en la aplicacin se recomienda (por orden):
1. No utilizar RB6/RB7 de manera tal que sean dedicados a ICSP.
2. Utilizar estos pines como salidas empleando una mnima carga sobre la lnea de seal.
3. Circuito aislante de manera que estas seales puedan ser manejadas de acuerdo a las
especificaciones del ICSP.

232

Figura 23.1

Circuito de aplicacin tpico para programacin serial ICSP

La capacitancia total sobre los pines de programacin afecta la relacin de subida (rise rate)
de estas seales cuando son proporcionadas por el programador. Algunos circuitos tpicos
utilizan varios cientos de microfaradios de capacitancia sobre VDD lo cual ayuda a reducir el
ruido (noise) y el rizo (ripple). Sin embargo, esta capacitancia requerir de una gran capacidad
de manejo de corriente en el programador para alcanzar el tiempo de subida (rise time) para
VDD. Muchos programadores son diseados para programar de una manera simple los
microcontroladores PIC pero sin tener suficiente capacidad de manejo de corriente (drivers)
para alimentar el circuito de aplicacin. Una solucin podra ser el utilizar una tarjeta
manejadora (driver board) entre el programador y el circuito de aplicacin. Esta tarjeta requerir
de una fuente de poder separada, capz de manejar los pines de VPP y VDD con la correcta
relacin de subida (rise rate) y proveer suficiente corriente para alimentar el circuito de
aplicacin. RB6 y RB7 no son amplificados (buffered) en este esquemtico pero podra requerir
de amplificacin dependiendo de la aplicacin. La figura 23.2 muestra el esquemtico de una
tarjeta manejadora (driver board) de muestra.
Nota:

El diseo de la tarjeta manejadora (driver board) deber ser probado en la aplicacin


del usuario para determinar los efectos del circuito de aplicacin sobre los tiempos de
las seales del programador. Algunos cambios podran ser requeridos si la aplicacin
representara una carga significativa sobre VDD, VPP, RB6 o RB7.

Las especificaciones de programacin de MICROCHIP consideran que el microcontrolador


deber ser programado a 5V. Algunas consideraciones especiales debern ser hechas si el
circuito de aplicacin operara nicamente a 3V. Una de estas consideraciones podra incluir
tener un aislamiento total del microcontrolador durante programacin. El otro asunto
corresponde a que el microcontrolador deber ser verificado aplicando los voltajes mnimo y
mximo con los que operar el circuito de aplicacin. Por ejemplo, un sistema operado con
bateras podra operar con 3 celdas de 1.5V cada una, dando un rango de voltaje de operacin
de 2.7V a 4.5V. El programador debera programar el microcontrolador a 5V pero verificarlo a
2.7V y 4.5V para asegurar que los propios mrgenes de programacin han sido logrados. Esto
asegurar la correcta operacin del microcontrolador en dicho rango de voltaje en el sistema.
El asunto final se refiere al oscilador del circuito de aplicacin. El voltaje sobre el pin MCLR/VPP
deber subir (rise) para entrar en modo programacin antes de que el microcontrolador ejecute
algn cdigo. Los modos del oscilador de cristal disponibles en el microcontrolador no
afectarn este tpico porque el temporizador de arranque del oscilador esperar 1024
oscilaciones antes de que cualquier cdigo sea ejecutado. Sin embargo, los osciladores RC no
requieren ningn tiempo de arranque y por consiguiente, el temporizador de arranque del
oscilador no ser usado. El programador deber manejar el voltaje MCLR/VPP para entrar en

233

modo de programacin antes de que el oscilador RC haya oscilado (toggle) cuatro veces. Si
oscilara cuatro o ms veces, el contador de programa se incrementara a un valor X. Ahora,
cuando el microcontrolador entrara al modo de programacin, el contador de programa (PC) no
sera cero y el programador empezara programando el cdigo con un desfase (offset) X.
Existen algunas alternativas que pudieran compensar una relacin de subida (rise rate) lenta
sobre el pin MCLR/VPP. El primer mtodo podra ser no montar la R, programar el
microcontrolador y posteriormente insertar la R. El otro mtodo podra ser el tener el pin OSC1
en el microcontrolador a travs de la interfase del programador a tierra mientras el
microcontrolador es programado. Esto prevendr cualquier oscilacin durante la programacin.
El programador
La segunda consideracin es el programador. Los microcontroladores PIC16Cxxx usan
nicamente programacin serial y en consecuencia todos los programadores soportarn ICSP.
Un asunto con el programador es la capacidad de manejo de corriente (drive capability). Como
se menciono anteriormente, ste deber ser capz de proporcionar la relacin de subida (rise
rate) especificada sobre las seales de ICSP y tambin proporcionar suficiente corriente al
circuito de aplicacin. La figura 23.2 muestra un ejemplo de la tarjeta manejadora (driver
board). Este esquemtico no muestra ningn circuito amplificador (buffer) para RB6 y RB7. Es
recomendable que sea realizada una evaluacin para determinar si la amplificacin es
requerida. Otro asunto con el programador es, que niveles de VDD sern usados para verificar
el contenido de la memoria del microcontrolador. Por ejemplo, el programador PRO MATE II
verifica la memoria de programa con los niveles de VDD mnimo y mximo para el modelo del
microcontrolador especfico, y por consiguiente, este programador es considerado un
programador de calidad para produccin.

Por otra parte, el programador PICSTART Plus nicamente verifica a 5V y es considerado un


programador para prototipos. Las especificaciones de programacin de MICROCHIP dice que
el contenido de la memoria de programa deber ser verificado con los niveles mnimo y
mximo de VDD con que el circuito de aplicacin estar operando. Esto implica que el circuito
de aplicacin debera ser capz de manipular la variacin en el voltaje VDD.
Existen tambin una gran variedad de programadores disponibles de otros proveedores
diferentes a MICROCHIP. Se deber tener mucho cuidado en la seleccin de alguno de estos
programadores para que llenen las expectativas del ambiente de programacin.
Ambiente de programacin
El ambiente de programacin afectar: el tipo de programador a usar, la longitud del cable del
programador y la interfase al circuito de aplicacin. Algunos programadores satisfacen los
requerimientos para lneas de produccin de ensamble manual mientras que otros son
deseables en lneas de produccin automatizadas. Finalmente, es posible necesitar un
programador mltiple (gang) para programar mltiples sistemas a un mismo tiempo.
La distancia fsica entre el programador y el circuito de aplicacin afectar la capacitancia de
carga en cada una de las seales de programacin. Esto directamente afectar la potencia
necesaria para proporcionar la adecuada corriente y relacin de subida (rise rate) de la seal.
Este cable del programador deber ser lo ms corto posible y debidamente terminado y aislado
(shielded) o las seales de programacin podran corromperse debido al ruido.
Finalmente, la interfase del circuito de la aplicacin al programador depender de la restriccin
del tamao del circuito de aplicacin en si y la lnea de ensamble. Un simple conector (header)
podra ser usado como interfase. Esto podra ser muy deseable para una lnea de ensamble
manual donde un tcnico inserte el cable del programador dentro de la tarjeta. Un mtodo

234

diferente sera el uso de pines de prueba con resorte (comnmente llamados pogo pins). El
circuito de aplicacin deber tener pistas (pads) sobre la tarjeta para cada una de las seales
de programacin. Entonces, existir una fixtura (fixture) que tendr los pogo pins en la misma
posicin que los pads en la tarjeta. La fixtura o la tarjeta ser movida en una posicin tal que
los pogo pins entren en contacto con los pads en la tarjeta. Este mtodo podra ser ms
adecuado para una lnea de ensamble automatizada.
Despus de tomar en consideracin todos los puntos anteriores con el circuito de aplicacin, el
programador y el ambiente de programacin, cualquier persona podra construir una lnea de
manufactura confiable de alta calidad basada en la programacin serial ICSP.
Otros beneficios
La programacin serial ICSP brinda otros beneficios, tales como calibracin y serializacin. Si
la memoria de programa lo permite, sera ms econmico y ms confiable almacenar
constantes de calibracin en la memoria de programa en lugar de utilizar una memoria serial
EEPROM externa. Por ejemplo, si el sistema tuviera un termistor (thermistor), el cual pudiera
variar de un sistema a otro, almacenando alguna informacin de calibracin en forma de tabla,
permitira que el microcontrolador compensara (por programa) por tolerancias de componentes
externos. El costo del sistema podr ser reducido sin afectar el desempeo requerido por el
mismo, utilizando tcnicas de calibracin. Pero, Como hacer esto con la programacin serial
ICSP? El microcontrolador ya ha sido programado con un programa (firmware) que ejecuta un
ciclo de calibracin. Los datos de calibracin son transferidos a una fixtura (fixture) de
calibracin. Cuando todos los datos de calibracin han sido transferidos, la fixtura pone al
microcontrolador en modo de programacin y programa al microcontrolador con los datos de
calibracin. La nota de aplicacin AN656 de MICROCHIP muestra exactamente como
implementar la programacin de datos de calibracin.
El otro beneficio de la programacin serial ICSP es la serializacin del producto (asignar un
nmero de serie). Cada sistema individual podr ser programado con un nico y/o aleatorio
nmero de serie. Una de tales aplicaciones para la asignacin de un nmero de serie nico
podra ser para sistemas de seguridad. Un sistema tpico podra utilizar mini-interruptores (DIP
switches) para asignar el nmero de serie. O bien, en lugar de eso, este nmero podra ser
asignado dentro de la memoria del programa para reducir el riesgo de equivocacin del
operador que manipula dichos mini-interruptores.
Programacin de microcontroladores OTP en el campo
Un dispositivo OTP normalmente no es capz de ser re-programado, pero la arquitectura de los
microcontroladores PIC nos proporciona esta flexibilidad siempre y cuando el tamao del
programa (firmware) sea al menos de la mitad de la capacidad total y el dispositivo no se
encuentre con el cdigo protegido. Si el modelo del microcontrolador elegido no tuviera
suficiente memoria de programa, MICROCHIP provee una gama muy amplia de modelos entre
0.5K y 8K de memoria de programa con el mismo conjunto de caractersticas de perifricos que
ayudarn a encontrar uno que se adecue a sus necesidades.
Los microcontroladores PIC16Cxxx poseen dos vectores, el de arranque (reset) y el de
interrupcin, en las localidades 0x0000 y 0x0004 respectivamente. Cuando el microcontrolador
encuentra una condicin de arranque (reset) o de interrupcin, el cdigo localizado en alguna
de esas dos localidades ser ejecutado. El primer listado del ejemplo 23.2 muestra el cdigo
que es primeramente programado en el microcontrolador. El segundo listado del ejemplo 23.2
muestra el cdigo que es programado en el microcontrolador por segunda vez.

235

El ejemplo 23.2 muestra que para programar el microcontrolador por segunda vez, la localidad
de memoria 0x0000, originalmente goto Main (0x2808), es reprogramada como todos los bits
en 0s, es decir, a convertirla en una instruccin NOP. Esta localidad no podr ser
reprogramada con el nuevo cdigo (opcode) (0x2860) debido a que los bits que son 0 no
pueden ser reprogramados a 1, solamente bits 1 podrn ser reprogramados a 0. La
prxima localidad en la memoria de programa 0x0001 fu dejada en blanco (todos 1s) y ahora
vendr a ser goto Main (0x2860). Cuando una condicin de arranque (reset) ocurra, el
microcontrolador ejecutar la instruccin de la localidad 0x0000, la cual es una instruccin
NOP, una instruccin absolutamente benigna, y posteriormente ejecutar la instruccin goto
Main para iniciar la ejecucin del cdigo. El ejemplo tambin muestra que todas las
localidades de la memoria de programa posteriores a 0x005A se encuentran en blanco en el
programa original, de manera tal que la segunda vez que el microcontrolador sea programado,
el cdigo revisado pudiera ser programado en estas localidades. La misma descripcin puede
ser dada para el vector de interrupcin (localidad 0x0004).
Este mtodo cambia ligeramente para microcontroladores con ms de 2K palabras de memoria
de programa. Cada una de las instrucciones goto Main y goto ISR son remplazadas por el
segmento de cdigo del ejemplo 23.1 debido a las pginas (paging).
Ejemplo 23.1 Cruce de pginas en la memoria de programa

Ahora los microcontroladores OTP poseen cualidades de los que contienen memorias
EEPROM o FLASH.

236

Ejemplo 23.2

Listado de archivos de ciclo de programacin

Programacin de microcontroladores FLASH en el campo


Con el circuito de interfase ICSP en su lugar, los microcontroladores basados en memoria de
programa FLASH podrn ser reprogramados fcilmente en el campo. Estos dispositivos podrn
ser reprogramados an si fueron protegidos en su cdigo. Una estacin de programacin ICSP
porttil podra consistir de una computadora tipo lap-top y un programador. Un tcnico
instalar el cable del programador sobre el circuito de aplicacin y descargar el nuevo
programa (firmware) dentro del microcontrolador.

237

Figura 23.2

Esquemtico de la tarjeta manejadora de ejemplo

238

Programacin del microcontrolador OTP PIC12C67X con ICSP


En esta seccin se presenta la informacin tcnica necesaria para entender el proceso de
programacin serial ICSP. Se ha enfocado hacia una familia especfica (la serie 12C67x y
12CE67x), con el objeto de dar informacin ms precisa, ya que existen algunas diferencias
entre cada una de estas familias de microcontroladores. Sin embargo, una vez entendida esta
informacin, aplicarla en cualquier modelo ser relativamente sencillo ya que la manera de
programarlos es muy similar.
Primeramente mencionaremos que se requerirn de dos fuentes programables, una para
generar el voltaje VDD (2.0V a 6.0V recomendado) y otra para generar el voltaje VPP (12V a
14V). Ambas fuentes de poder debern tener una resolucin mnima de 0.25V.
El modo de programacin en el microcontrolador permite programar la memoria de programa,
las localidades especiales usadas para identificacin (ID) y la palabra de configuracin.
El espacio de memoria del usuario se extiende de la localidad 0x0000 a la localidad 0x1FFF
(8K). La tabla 23.1 muestra la implementacin de la memoria de programa en la familia
PIC12C67X.
Tabla 23.1 Implementacin de la memoria de programa en el PIC12C67x

Cuando el contador de programa (PC) encuentre la ltima localidad de la memoria de


programa implementada, se direccionar a la primera localidad implementada de esa misma
memoria (ver figura 23.3).
En el modo de programacin, el espacio de la memoria de programa se extiende de la 0x0000
a 0x3FFF, con la primera mitad (0x0000 0x1FFF) como memoria de programa del usuario y
la segunda mitad (0x2000 0x3FFF) como memoria de configuracin. El contador de programa
(PC) se incrementar de la 0x0000 hasta la 0x1FFF y pasar (como una memoria circular) a la
0x0000. Asimismo, la memoria de configuracin se incrementar de la 0x2000 a la 0x3FFF y
pasar a la 0x2000 (no a la 0x0000). Una vez que el PC se encuentre apuntando a la memoria
de configuracin, el bit ms alto del PC estar en 1, por lo que siempre apuntar a la misma
memoria de configuracin. La nica manera de apuntar a la memoria de programa es volver a
arrancar (reset) el microcontrolador y re-entrar al modo de programar/verificar, de la misma
manera que se describi anteriormente.
La ltima localidad del espacio de la memoria de programa contiene el valor de calibracin del
oscilador, el cual, por lo general en algunos modelos, ya viene programado de fbrica. Esta
localidad no deber ser programada excepto cuando se encuentre en blanco (es decir, todos
los bits en 1) (un valor diferente de blanco no debera fallar en la verificacin de memoria en
blanco (blank check). Si esta localidad estuviese en blanco, el programador debera
programarla con la instruccin RETLW XX, donde XX es el valor de calibracin.
En el espacio de la memoria de configuracin, solo el segmento 0x2000 0x20FF es utilizado,
y por lo tanto ser accedido repetidamente, es decir, que cuando el PC exceda la localidad
0x2XFF, en realidad acceder la localidad 0x2000 (memoria circular) (ver figura 23.3).

239

El usuario podr almacenar informacin de identificacin (ID) en cuatro localidades. Estas


localidades son mapeadas en las localidades [0x2000 0x2003].
Nota 1:

Todas las otras localidades en la memoria de configuracin


microcontrolador son reservadas y no debern ser programadas.

Nota 2:

Debido a aspectos de seguridad, la memoria EEPROM contenida en el


PIC12CE673/PIC12CE674, no podr ser accedida externamente sino
nicamente mediante el programa del usuario.
Figura 23.3

del

Mapa de la memoria de programa

Modo Programar/Verificar
El modo de programar/verificar es activado, manteniendo los pines GP1 y GP0 en su estado
bajo mientras que el pin MCLR es levantado (rising) de VIL a VIHH (alto voltaje). Posteriormente

240

es levantado VDD de VIL a VIH. Una vez estando en este modo, tanto la memoria de programa
como la memoria de configuracin podrn ser accedidas y programadas de manera serial. El
modo de operacin es serial, y la memoria accedida corresponde a la memoria de programa
del usuario. En este modo GP1 es una entrada tipo Schmitt Trigger.
La secuencia que permite poner al microcontrolador en el modo de programar/verificar, hace
que toda la otra lgica entre en su estado inactivo (reset) (recordemos que el pin MCLR estaba
inicialmente a VIL). Esto significa que todas la entradas/salidas (I/O) estarn en el estado
inactivo (reset) (entradas en alta impedancia).
Nota 1:
El pin MCLR deber ser levantado de VIL a VIHH antes de que VDD sea aplicado.
Esto es para asegurar que el microcontrolador no tendr el contador de
programa (PC) incrementado mientras se encuentre en un rango de operacin
vlida.
Nota 2:

No aplique ningn voltaje en los pines GP2, GP4 o GP5 antes de que VDD sea
aplicado.

Operacin de programacin/verificacin
El pin GP1 ser usado como un pin de entrada de reloj mientras que el pin GP0 ser usado
como entrada/salida de datos durante la operacin serial. Para introducir un comando, el pin
del reloj (GP1) ser ciclado seis veces. Cada bit del comando ser capturado (latched) con el
flanco de bajada (falling edge) del reloj, y con el bit menos significante (LSB) del comando
entrando primero. El dato sobre el pin GP0 requerir tener un tiempo mnimo de estabilizacin
(minimum setup and hold time) con respecto al flanco de bajada (falling edge) del reloj. Los
comandos que tengan un dato asociado (comandos de LECTURA (Read) y CARGA (Load))
debern tener un retardo de 1s entre el comando y el dato. Despus de este retardo el pin del
reloj deber ser ciclado 16 veces con el primer ciclo siendo un bit de inicio (Start) y el ltimo
ciclo siendo un bit de paro (Stop). El dato entrante o saliente se har tambin con el bit menos
significante (LSB) primero. Por consiguiente, durante una operacin de lectura el bit LSB ser
transmitido sobre el pin GP0 con el flanco de subida (rising edge) del segundo ciclo, y durante
una operacin de carga, el bit menos significante (LSB) ser atrapado (latched) con el flanco de
bajada (falling edge) del segundo ciclo. Un retardo de 1s mnimo deber ser generado
tambin entre comandos consecutivos.
En resumen, todos los comandos son transmitidos con el bit LSB primero. Las palabras de
datos son tambin transmitidas con el bit LSB primero. El dato es transmitido con el flanco de
subida (rising edge) y atrapado (latched) con el flanco de bajada (falling edge) del reloj. Con el
objeto de permitir la decodificacin de los comandos y el cambio de configuracin de la
direccin del pin de datos, un tiempo de separacin de por lo menos 1s ser requerido entre
el comando y la palabra de dato (u otro comando). Los comandos disponibles son listados en la
tabla 23.2.
Tabla 23.2

Mapa de comandos

241

El comando Carga de Configuracin (LOAD CONFIGURATION)


Despus de recibir este comando, el contador de programa (PC) ser puesto apuntando a la
localidad 0x2000. Mediante la aplicacin de 16 ciclos sobre el pin de reloj, el microcontrolador
cargar 14 bits de dato (una palabra de dato) como se describi anteriormente, para ser
programada dentro de la memoria de configuracin. Una descripcin de los esquemas del
mapa de memoria para una operacin normal y operacin en modo configuracin es mostrada
en la figura 23.3. Una vez que se ha entrado a la memoria de configuracin, la nica manera de
regresar a la memoria de programa ser saliendo del modo de programar/verificar poniendo el
pin MCLR en su estado bajo (VIL) y volviendo a entrar en el modo programar/verificar.
El comando Carga Dato (LOAD DATA)
Despus de recibir este comando, el microcontrolador cargar una palabra de dato de 14 bits
cuando sean aplicados 16 ciclos como se describi con anterioridad. Un diagrma de tiempos
para el comando Carga Dato es mostrado en la figura 23.7.
El comando Lee Dato (READ DATA)
Despus de recibir este comando, el microcontrolador transmitir bits de datos de la memoria
accedida empezando con el segundo flanco de subida (rising edge) del reloj de entrada. El pin
GP0 ir al modo de salida en el segundo flanco de subida (rising edge) del reloj y se revertir
nuevamente al modo de entrada (alta impedancia) despus del 16 flanco de subida (rising
edge). Un diagrma de tiempos de este comando se muestra en la figura 23.8.
El comando Incrementa direccin (INCREMENT ADDRESS)
El contador de programa (PC) ser incrementado cuando este comando sea recibido. Un
diagrma de tiempos de este comando se muestra en la figura 23.9 .
El comando Inicia programacin (BEGIN PROGRAMMING)
Un comando de carga dato (LOAD DATA) o carga configuracin (LOAD CONFIGURATION)
deber ser enviado antes de cada comando de inicio de programacin (BEGIN
PROGRAMMING).
Se iniciar la programacin de la localidad apropiada de memoria (de programa o de
configuracin) despus de haber recibido y decodificado este comando. La programacin
deber ser realizada mediante una serie de pulsos de programacin de 100 s. Un pulso de
programacin es definido como el tiempo entre el comando de inicio de programacin (BEGIN
PROGRAMMING) y el comando de fin de programacin (END PROGRAMMING).
El comando Fin de Programacin (END PROGRAMMING)
Despus de recibir este comando, el microcontrolador parar la programacin de la memoria
(de programa o de configuracin) que se estaba programando en ese momento.

242

El algoritmo de programacin requerir de un voltaje VDD variable


Los modelos PIC12C67X y PIC12CE67X utilizan un algoritmo inteligente. Este algoritmo llama
a verificar el programa con VDD mn. y VDD mx. La verificacin con VDD mn. garantiza un buen
margen de borrado mientras que la verificacin con VDD mx. garantiza un buen margen de
programacin. La programacin deber ser hecha en el rango requerido para VDD (4.75V
5.25V).
Los programadores debern verificar el microcontrolador con los niveles de VDD mn. y VDD
mx. Debido que MICROCHIP pudiera introducir nuevos productos con un rango de voltajes
VDD ms amplios, sera mejor dejar que estos niveles fueran seleccionables por el usuario.
Nota:

Cualquier programador que no cumpla con estos requerimientos podra ser clasificado
como un programador para desarrollo o para prototipos, pero nunca como un
programador de calidad para produccin.

Palabra de Configuracin (CONFIGURATION WORD)


La familia de microcontroladores PIC12C67X y PIC12CE67X tiene varios bits de configuracin.
Estos bits pueden ser programados (ledos como 0) o dejados sin programar (ledos como
1) para seleccionar varias configuraciones del microcontrolador. La figura 23.4 proporciona
una vista de los bits de configuracin.
Figura 23.4

Palabra de configuracin

243

Proteccin del cdigo (Code Protection)


El cdigo del programa escrito sobre la memoria de programa (EPROM) podr ser protegido
mediante los bits CP0 y CP1 de la palabra de configuracin.
Una vez que la proteccin del cdigo sea habilitada, todos los segmentos protegidos se leern
como 0 (o valores aleatorios) y no podrn volverse a programar. Todos los segmentos no
protegidos, incluyendo las localidades de identificacin (ID), la palabra de configuracin y la
palabra de calibracin, se podrn leer normalmente y podrn ser programadas.
La palabra de configuracin y la informacin de identificacin (ID) integradas en el
archivo Hex
Para permitir la portabilidad del cdigo, el programador deber leer la palabra de configuracin
y las localidades de identificacin (ID) desde el archivo hex. Si la informacin de la palabra de
configuracin no estuviera presente en el archivo hex entonces un simple mensaje de
advertencia podra ser mostrado.

244

Figura 23.5 Diagrma de flujo de programacin de la memoria de programa

245

Figura 23.6 Diagrma de flujo de programacin de CONFIGURACIN y ID

246

Tabla 23.3

Palabra de Configuracin (PIC12C671, PIC12CE673)

Checksum
Clculo de la suma de verificacin o Checksum
La suma de verificacin o Checksum es un valor de 16 bits que nos permite verificar si alguna
transferencia de informacin ha sido correcta, es decir, libre de errores de
transmisin/recepcin. Este Checksum es calculado leyendo el contenido de las localidades
de la memoria y sumando todos los cdigos de operacin (de las instrucciones) hasta la
localidad mxima direccionable, excluyendo la localidad de calibracin del oscilador (ltima
localidad). Cualquier bit de acarreo excediendo los 16 bits no ser tomado en cuenta.
Finalmente, la palabra de calibracin es sumada al valor del Checksum. El clculo del
Checksum para los microcontroladores de la familia PIC12C67x/PIC12CE67x es mostrada en
la tabla 23.4.
El Checksum es calculado por sumar lo siguiente:

El contenido de todas las localidades de la memoria de programa


La palabra de configuracin

247

Tabla 23.4

Clculo del Checksum

Figura 23.7 Comando Carga Dato (LOAD DATA) (modo programar/verificar)

Figura 23.8 Comando Lee Dato (READ DATA) (modo programar/verificar)

248

Figura 23.9 Comando Incrementa Direccin (INCREMENT ADDRESS)


(modo programar/verificar)

249

250

24

Conjunto de Instrucciones

Existen microcontroladores de 12, 14 y 16 bits (por palabra). La serie 12Cxxx son de 12 y 14


bits, la serie 16Cxxx son de 14 bits y la serie 17Cxxx y 18Cxxx son de 16 bits. En este captulo
presentaremos las instrucciones correspondientes a los microcontroladores de rango medio, es
decir, de la serie 16Cxxx. Sin embargo, existe muy poca diferencia en cuanto a la funcin de
las instrucciones entre las diferentes series, pero una vez comprendidas las del rango medio,
prcticamente se podrn comprender las de cualquier otra serie. Para asegurarse que las
instrucciones que se usarn en la elaboracin del cdigo del programa de aplicacin, refirase
al manual de usuario del modelo del microcontrolador a usar.
As pues, cada instruccin en el rango medio es de 14 bits (por palabra) dividida en un cdigo
de operacin (OPCODE) el cual especifica el tipo de instruccin y uno o ms operandos que
especifican la operacin de la instruccin. Un resumen del conjunto de instrucciones
reconocidas por el ensamblador MPASM es listado en la tabla 24.1. El conjunto de
instrucciones es altamente ortogonal y es agrupado en tres categoras bsicas:

Operaciones orientadas a bytes (Byte-oriented)


Operaciones orientadas a bits (Bit-oriented)
Operaciones numricas y de control (Literal and Control)

La tabla 24.2 nos muestra las descripciones de los campos del cdigo de operacin (opcode).
Para instrucciones orientadas a bytes, f representa el registro de fila que ser utilizado en la
instruccin, y d representa el destino en donde ser puesto el resultado de la operacin. Si d
= 0, el resultado ser puesto en el registro W. Si d = 1, el resultado ser puesto en el registro
de fila especificado en la instruccin.
Para instrucciones orientadas a bits, b representa un bit del campo, el cual selecciona el
nmero del bit afectado por la operacin, mientras que f representa el nmero de la fila en el
cual el bit ser localizado.
Para operaciones de control y literales, k representa una constante de ocho u once bits o valor
literal.
Todas las instrucciones son ejecutadas en un solo ciclo de instruccin, a menos que una
prueba condicional sea verdadera (true) o el contador del programa (PC) sea cambiado como
resultado de una instruccin. En estos casos, la instruccin tomar dos ciclos de instruccin
con el segundo ciclo ejecutado una instruccin NOP. Un ciclo de instruccin consiste de cuatro
periodos del oscilador. As, para una frecuencia de oscilador de 4 MHz, el tiempo de ejecucin
normal de la instruccin ser de 1 . Si una prueba condicional resultase verdadera (true) o el
contador del programa fuese cambiado como un resultado de una instruccin, el tiempo de
ejecucin de la instruccin sera de 2

251

Tabla 24.1

Nota:

Conjunto de instrucciones del rango medio (PIC16Cxxx)

El campo de descripcin de la tabla no fu traducido debido al pequeo espacio


disponible con que se cuenta, pero en la descripcin detallada de cada instruccin
(ms adelante) si se har dicha traduccin.

252

Formato de la instruccin
La figura 24.1 muestra los tres formatos generales que la instruccin pueda tener. Como se
podr ver desde el formato general de la instruccin, la porcin del cdigo de operacin
(opcode) de la palabra de la instruccin varia entre 3 y 6 bits de informacin. Esto es lo que
permite al conjunto de instrucciones del rango medio tener solo 35 instrucciones.
Nota 1:

Cualquier cdigo de operacin (opcode) no utilizado ser reservado. El uso de


cualquier cdigo de operacin reservado podra causar alguna operacin
inesperada.

Nota 2:

Para mantener una compatibilidad con futuros productos del rango medio, NO
UTILICE las instrucciones OPTION y TRIS.

Todos los ejemplos de instrucciones utilizan el siguiente formato para representar nmeros
hexadecimales:
0xhh
donde h significa un digito hexadecimal.
Para representar un nmero binario:
00000100b
donde b es un identificador de una cadena (string) binaria.
Figura 24.1

Formato general para las instrucciones

253

Tabla 24.2

Convenciones en la descripcin de la instruccin

Registros de funcin especial como Fuente/Destino (Source/Destination)


El conjunto de instrucciones ortogonales permiten leer y escribir a y desde todos los registros
de fila, incluyendo los registros de funcin especial. Algunas situaciones especiales sern
descritas a lo largo de este captulo.
El registro STATUS como destino
Si alguna instruccin escribiera en el registro STATUS, los bits Z, C, DC y OV podrn ser
encendidos o apagados como un resultado de la instruccin y sobre-escribir en los bits de dato
originalmente escritos. Por ejemplo, ejecutando la instruccin CLRF STATUS borrar (clear) el
registro STATUS y posteriormente encender el bit Z, dejando en el registro un valor 0000
0100b.
El registro PCL como fuente o como destino
Leer, escribir o leer-modificar-escribir sobre el registro PCL podra tener los siguientes
resultados:

254

Leer PC:

PCL

Escribir en PCL:

PCLATCH
PCH
Valor de 8 bits del destino

Leer-Modificar-Escribir: PCL

dest

PCLATCH no cambia

operando del ALU


PCLATCH
PCH
Resultado de 8 bits

PCL

PCL

Donde PCH = Byte alto del contador de programa (no es un registro direccionable), PCLATCH
= Latch que mantiene el contador de programa alto, dest = destino, ya sea el registro W o el
registro de fila f.
Manipulacin de bits
Todas las instrucciones de manipulacin de bits primero leern el registro completo, operarn
sobre el bit seleccionado y entonces escribirn el resultado de regreso (leer-modificar-escribir)
(read-modify-write) (R-M-W) en el registro especificado. El usuario deber recordarlo cuando
opere sobre algunos registros de funcin especial, tales como puertos.
Nota:

Los bits de STATUS que son manipulados por el microcontrolador (incluyendo los bits
de bandera de interrupcin) son encendidos o apagados en el ciclo Q1. As que no
existir ningn problema al ejecutar instrucciones del tipo leer-modificar-escribir sobre
registros que contengan estos bits.

Actividad del ciclo Q


Cada ciclo de instruccin (TCY) esta comprendido de cuatro ciclos Q (Q1-Q4). El ciclo Q es el
mismo que el ciclo del oscilador del microcontrolador (TOSC). Los ciclos Q proporcionan los
tiempos/designacin (timing/designation) para la decodificacin (Decode), lectura (Read),
procesamiento del dato (Data Process), escritura (Write), etc., de cada ciclo de instruccin. El
siguiente diagrma muestra la relacin de los ciclos Q con el ciclo de instruccin.
Los cuatro ciclos Q que estructuran un ciclo de instruccin (TCY) podran ser generalizados
como:
Q1: Ciclo de decodificacin de la instruccin o una no-operacin forzada
Q2: Ciclo de lectura de la instruccin o una no-operacin
Q3: Procesamiento del dato
Q4: Ciclo de escritura de la instruccin o una no-operacin
Cada instruccin mostrar la operacin del ciclo Q para esa instruccin.
Figura 24.2

Actividad del ciclo Q

255

Descripcin de las instrucciones


A continuacin se presentan todas y cada una de las instrucciones debidamente detalladas,
pertenecientes al conjunto que integran los microcontroladores de la serie PIC16Cxxx, las
cuales estn formadas con palabras de 14 bits.

256

257

258

259

260

261

262

263

264

265

266

267

268

269

270

271

272

273

274

275

276

277

278

279

280

281

282

283

284

285

286

287

288

289

290

291

292

25

Ensamblador MPASM

El lenguaje ensamblador MPASM es un programa para desarrollar cdigo de instrucciones


para la familia de microcontroladores PIC de MICROCHIP. Generalmente, el ensamblador
MPASM se referir a la plataforma de desarrollo incluyendo el Macro ensamblador y las
funciones de utilera.
Debido a que el ensamblador MPASM es un ensamblador universal para todos los
microcontroladores PIC de MICROCHIP, una aplicacin desarrollada para el PIC16C54 podr
fcilmente ser trasladada a un programa para el PIC16C71. Lo que se requerir ser cambiar
los mnemnicos de las instrucciones que no sean iguales entre los modelos de
microcontroladores (asumiendo que los registros y los perifricos fueran similares). El resto de
las directivas y el macro-lenguaje ser el mismo.
El ensamblador MPASM podr ser utilizado en dos maneras:

Para generar cdigo absoluto para ser ejecutado directamente por el microcontrolador
Para generar cdigo objeto que pueda ser encadenado (linked) con otros programas
ensamblados separadamente u otros mdulos compilados

Generacin de cdigo absoluto


El cdigo absoluto es la salida (por default) del ensamblador MPASM. Cuando un archivo
fuente sea ensamblado en esta manera, los valores usados en el archivo fuente debern ser
definidos dentro del mismo archivo o en archivos que hayan sido incluidos explcitamente. Si el
proceso de ensamble ocurriera sin errores, un archivo HEX sera generado, conteniendo el
cdigo de mquina ejecutable para un modelo de microcontrolador especfico. Este archivo
ser utilizado por el programador de dispositivos para programar el microcontrolador.
Generacin de cdigo objeto
El ensamblador MPASM tambin tiene la habilidad de generar un mdulo objeto que podra ser
encadenado (linked) con otros mdulos usando el programa encadenador MPLINK de
MICROCHIP para formar el cdigo ejecutable final. Este mtodo es muy til para crear
mdulos re-usables que no tengan que ser probados cada vez que stos sean utilizados.
Los mdulos relacionados podrn ser tambin agrupados y almacenados juntos en una librera
(library) utilizando el programa generador de libreras MPLIB de MICROCHIP. Las libreras
requeridas podrn ser especificadas en el momento de ser encadenadas (link time), y
nicamente las rutinas necesarias sern incluidas en el cdigo ejecutable final.

293

Objetos relocalizables
Para generar un mdulo objeto pre-compilado, escriba un cdigo fuente para ser ensamblado a
un mdulo objeto. Esto se har de una manera ligeramente diferente a la usada para generar
directamente un cdigo ejecutable. Las rutinas diseadas para ensamblarse con direcciones
absolutas requerirn menores modificaciones para compilarse correctamente en mdulos
objetos relocalizables.
Archivos Header
Los archivos Header estndar proporcionados por MICROCHIP (por ejemplo, p16c54.inc)
debern ser utilizados en el momento de generar los mdulos objeto. Estos archivos definen
los registros de funcin especial para un modelo de microcontrolador especfico.
Memoria de programa
El cdigo de la memoria de programa deber ser precedido por una declaracin de seccin
CODE.
Cdigo absoluto:
Start

CLRW
OPTION
:
:

Cdigo relocalizable:
CODE
Start

CLRW
OPTION
:
:

Si ms de una seccin CODE fuese definida en un archivo fuente, cada seccin deber tener
un nombre nico. Si el nombre no fuera especificado, se le asignara el nombre .code.
Cada seccin de la memoria de programa deber ser contnua dentro de un archivo fuente
sencillo, es decir, que una seccin no podr ser partida en piezas dentro de un archivo fuente
sencillo.
La direccin fsica del cdigo podr ser fija, en cuyo caso se deber proporcionar el parmetro
de la direccin (opcional) de la directiva CODE. Las situaciones en donde esto podra ser
necesario se presentan en la seccin: Especificando vectores de interrupcin.
Asegurase de que el segmento del cdigo no se traslape (overlap) en las fronteras de la
pgina.
Ejemplo de cdigo relocalizable:
Reset

CODE
GOTO

H01FF
Start

294

Main

CODE
CLRW
OPTION

Operandos de la instruccin
Existen algunas restricciones con respecto a los operandos de la instruccin. Los operandos
debern ser de la forma:
[HIGH | LOW | UPPER] (<Smbolo relocalizable> + < offset constante >)

<Smbolo relocalizable> es cualquier etiqueta que defina una direccin de memoria de


programa o de dato. Podr ser omitido.
< offset constante > es una expresin que pueda ser resuelta al tiempo del
ensamblado, con un valor resultante entre -32768 y 32767. Podr ser omitido.

Los operandos de la forma:


<Smbolo relocalizable> - <Smbolo relocalizable>
sern reducidos a un valor constante, siempre y cuando ambos smbolos sean definidos en la
misma seccin code o data.
Si HIGH fuese usado, solo los bits 8 a 15 de la expresin sern utilizados. Si LOW fuese
usado, solo los bits 0 a 7 de la expresin sern utilizados. Finalmente, si UPPER fuese usado,
solo los bits 16 a 21 de la expresin sern usados.
Localidades de la memoria de datos RAM
El espacio de RAM deber estar localizado dentro de una seccin de datos. Existen cinco tipos
de secciones de datos disponibles:

UDATA Datos no inicializado. Esta es la seccin del tipo de datos ms comn. Las
localidades reservadas en esta seccin no son inicializadas y solo podrn ser
accedidas por etiquetas definidas en esta seccin o por accesos indirectos.
UDATA_ACS Datos de acceso no inicializado. Esta seccin de datos es usada para
variables que sern puestas en acceso a RAM de los microcontroladores PIC18CXXX.
El acceso a RAM es usado como un acceso rpido de datos para instrucciones
especificadas.
UDATA_OVR Datos encimados (overlayed) no inicializados. Esta seccin de datos
es usada para variables que puedan ser declaradas en la misma direccin como otras
variables en el mismo mdulo o en otros mdulos encadenados. Un uso tpico de esta
seccin es para variables temporales.
UDATA_SHR Datos compartidos no inicializados. Esta seccin de datos es usada
para variables que sern puestas en RAM que sern compartidas a travs de todos los
bancos.
IDATA Datos inicializados. El encadenador (linker) generar una tabla que podr ser
usada para inicializar todas las variables en esta seccin con valores especficos. Las
localidades reservadas en esta seccin podrn ser accedidas nicamente por etiquetas
definidas en esta seccin o por acceso indirecto.

Los siguientes ejemplos muestran como podra ser creada una declaracin de datos.
Cdigo absoluto:

295

CBLOCK
0x20
InputGain, OutputGain ; Ganancias de mallas de control
HystoryVector
; Debe ser inicializado a 0.
Temp1, Temp2, Temp3 ; Usadas para clculos internos
ENDC
Cdigo relocalizable:
HystoryVector
InputGain
OutputGain
Temp1
Temp2
Temp3

IDATA
DB
UDATA
RES
RES
UDATA_OVR
RES
RES
RES

0
1
1
1
1
1

Si fuera necesario, las localidades de la seccin podran ser fijas en memoria proporcionando
el parmetro opcional de direccin. Si hubiese ms de un tipo de seccin especificado, cada
seccin deber tener su propio nombre. Si un nombre no fuese proporcionado, los nombres por
default de las secciones sern: .idata, .udata, .udata_ucs, .udata_shr y udata_ovr.
Cuando sean definidos datos inicializados en la seccin IDATA, las directivas DB, DW y DATA
podrn ser usadas. DB definir bytes sucesivos de memoria de datos. DW y DATA definirn
palabras (words) sucesivas de memoria de datos en el orden byte-bajo/byte-alto. Los
siguientes ejemplos muestran como los datos sern inicializados.
Cdigo relocalizable:
00001
LIST
p=17C44
00002
IDATA
0000 01 02 03
00003 Bytes
DB 1, 2, 3
0003 34 12 78 56 00004 Words DW H1234, H5678
0007 41 42 43 00 00005 String DB ABC, 0
Localidades de Configuracin e identificacin (ID)
Estas localidades podrn ser definidas en un mdulo objeto relocalizable utilizando las
directivas _ _CONFIG y _ _IDLOCS. nicamente un mdulo encadenado (linked) podr
especificar estas directivas. Estas debern ser usadas antes de declarar cualquier seccin
CODE. Despus de usar estas directivas, la seccin actual ser indefinida.
Teniendo acceso a etiquetas desde otros mdulos
Las etiquetas que sean definidas en un mdulo para ser usadas en otros mdulos, debern ser
exportadas usando la directiva GLOBAL. Las etiquetas debern ser definidas antes de que
stas sean declaradas GLOBAL. Los mdulos que usen estas etiquetas debern usar la
directiva EXTERN para declarar la existencia de estas etiquetas. Un ejemplo del uso de las
directivas GLOBAL y EXTERN es mostrado a continuacin.
Cdigo relocalizable, mdulo definidor:

296

UDATA
RES
RES
GLOBAL
CODE

InputGain
OutputGain
Filter

1
1
InputGain, OutputGain

GLOBAL
Filter
.
.
; Cdigo de Filter
Cdigo relocalizable, mdulo referenciador:

Reading

EXTERN
UDATA
RES
CODE
...
MOVLW
MOVWF
MOVLW
MOVWF
MOVF
CALL

InputGain, OutputGain, Filter


1

GAIN1
InputGain
GAIN2
OutputGain
Reading,W
Filter

Bancos y pginas
En muchos casos, la asignacin de memoria RAM abarcar mltiples bancos y el cdigo
ejecutable abarcar mltiples pginas. En estos casos ser necesario ejecutar una
configuracin de bancos y pginas para tener un acceso adecuado a las etiquetas. Sin
embargo, debido a que las direcciones absolutas de estas variables y direcciones de las
etiquetas no son conocidas al tiempo de ensamble, no siempre ser posible poner el cdigo
propio en el archivo fuente. Para estas situaciones se tienen dos nuevas directivas, BANKSEL
y PAGESEL. Estas directivas instruyen al encadenador (linker) a generar el banco correcto o el
cdigo de la pgina seleccionada para una especificada etiqueta. Un ejemplo de como el
cdigo debera ser convertido es mostrado a continuacin.
Cdigo absoluto:
#include
Var1
Var2

Subroutine

LIST P=12C509
PIC12C509.INC
EQU
H10
EQU
H30
...
MOVLW
InitialValue
BCF
FSR, 5
MOVWF
Var1
BSF
FSR, 5
MOVWF
Var2
BSF
STATUS, PA0
CALL
Subroutine
...
CLRW
...
RETLW 0

297

; En pgina 1

Cdigo relocalizable:
LIST P=12C509
PIC12C509.INC
UDATA
EQU
H10
EQU
H30
...
CODE
MOVLW
InitialValue
BANKSEL
Var1
MOVWF
Var1
BANKSEL
Var2
MOVWF
Var2
PAGESEL
Subroutine
CALL
Subroutine
...
CLRW
...
RETLW 0

#include
Var1
Var2

Subroutine

; En pgina 1

Directivas no disponibles
Con la capacidad Macro, casi todas las directivas son disponibles cuando se genera un
archivo objeto. La nica directiva que no es permitida es la directiva ORG. Esta podr ser
remplazada especificando un segmento CODE absoluto, como se muestra a continuacin.
Cdigo absoluto:
Reset

ORG
GOTO

H01FF
Start

Cdigo relocalizable:
Reset

CODE
GOTO

H01FF
Start

Generando el mdulo objeto


Una vez que el cdigo este completo, el mdulo objeto podr ser generado mediante el
requerimiento de un archivo objeto sobre la lnea de comando o en la interfase del interprete
(shell). Cuando se use el ensamblador MPASM para Windows, seale la opcin Object File.
Cuando se use la interfase DOS del comando de lnea, especifique la opcin / o y cambie
Assemble to Object File a Yes. El archivo de salida tendr una extensin .o.
Archivos de entrada/salida del ensamblador
A continuacin se presentan las extensiones de los archivos utilizados por el ensamblador y
por las funciones de utilera asociadas.

298

Archivos de entrada:
Cdigo fuente (Source Code) (.asm)

Extensin (default) del archivo fuente de


entrada al ensamblador.

Archivos de salida:
Archivo de listado (Listing File) (.lst)

Extensin (default) del archivo de salida del


listado generado por el ensamblador.

Archivo de errores (Error File) (.err)

Extensin (default) del archivo de salida del


reporte de errores generado por el
ensamblador.

Archivo Hex (Hex File) (.hex)

Extensin (default) del archivo de salida del


reporte hexadecimal generado por el
ensamblador.

Archivo Cod (Cod File) (.cod)

Extensin (default) del archivo de salida de


smbolos y depuracin (debug) generado por el
ensamblador.

Archivo objeto (Obj File) (.obj)

Extensin (default) del archivo de salida


objeto generado por el ensamblador.

Lenguaje Macro
Los Macros son conjuntos de instrucciones y directivas definidos por el usuario que se
evaluarn en lnea con el cdigo fuente del ensamblador cuando el Macro sea invocado. Los
Macros consisten de secuencias de instrucciones y directivas del ensamblador. stas podrn
ser escritas para aceptar argumentos, hacindolas muy flexibles. Sus ventajas son:

Altos niveles de abstraccin, mejorando la confiabilidad y haciendo que sea ms fcil


su lectura.
Soluciones consistentes a funciones ejecutadas frecuentemente.
Cambios simplificados.
Mejora en su forma de prueba.

Aplicaciones que podran incluir la creacin de tablas complejas, cdigo usado frecuentemente
y operaciones complejas.
Sintxis de Macros
Los Macros en el ensamblador MPASM son definidos de acuerdo a la siguiente sintaxis:
<etiqueta> macro [<arg1>, <arg2>, . . . , <argn>]
:
endm
donde <etiqueta> es una etiqueta vlida del ensamblador y <arg> es un nmero de argumentos
opcionales proporcionados al Macro. Los valores asignados a estos argumentos al tiempo en
que el Macro es invocado ser sustituido en el lugar donde el argumento ocurra en el cuerpo
del Macro.

299

El cuerpo del macro podr ser comprendido de directivas del ensamblador MPASM,
instrucciones del ensamblador o Macro directivas del ensamblador MPASM (LOCAL por
ejemplo). El ensamblador continuar procesando el cuerpo del Macro hasta que una directiva
EXITM o ENDM sea encontrada.
Nota:

Referencias a Macros anteriores a su definicin no son permitidas.

Macro directivas
Existen directivas que son nicas a las Macro definiciones. stas no podrn ser usadas fuera
del contexto del Macro.
Nota:

Las directivas no son sensibles a maysculas y minsculas (case-sensitive), por


ejemplo, cblock podra ser ejecutada como CBLOCK, cblock, Cblock, etc.

Las Macro directivas son:


CONTROL
constant <etiqueta> [=<expr>,...,
<etiqueta> [=<expr>] ]
#DEFINE
Define una etiqueta de susti#define <nombre> [ [ (<arg>,...,
tucin de texto
<arg>) ] <valor> ]
END
Fin de bloque de programa
end
EQU
Define una constante de ensamb.
<etiqueta> equ <expr>
ERROR
Edita un mensaje de error
error <text_string>
ERRORLEVEL Pon nivel de mensaje
errorlevel 0 | 1 | 2 | < > <msg>
#INCLUDE
Incluye archivo fuente adicional include <include_file>
MESSG
Crea mensaje definido por usuario
messg <message_text>
ORG
Pon origen del programa
<etiqueta> org <expr>
PROCESSOR Pon tipo de procesador
processor <processor_type>
RADIX
Especifica base (radix) default radix <default_radix>
SET
Define una variable en ensamblador
<etiqueta> set <expr>
#UNDEFINE Borra una etiqueta de sustitucin
#undefine <etiqueta>
VARIABLE
Declara smbolo de variable
variable <etiqueta> [=<expr>,...,
<etiqueta> [=<expr>] ]
CONSTANT

Declara smbolo constante

ENSAMBLADO CONDICIONAL
ELSE
ENDIF
ENDW
IF
IFDEF
IFNDEF
WHILE

Inicio de bloque de ensamble alternativo a IF


Fin de bloque de ensamble condicional
Fin de While Loop
Inicio de bloque de cdigo condicionalmente
ensamblado
Ejecuta si el smbolo ha sido definido
Ejecuta si el smbolo no ha sido definido
Ejecuta Loop While si condicin es cierta

else
endif
endw
if <expr>
ifdef<etiqueta>
ifndef <etiqueta>
while <expr>

DATA
__BADRAM
CBLOCK
__CONFIG

Especifica localidades de RAM invlidas


Define un bloque de constantes
Pon fusibles de configuracin

DA

Almacena string en mem. de programa

300

_ _badram <expr>
cblock <expr>
_ _config <expr> OR
_ _config <addr>, <expr>
[<etiqueta>] da <expr> [,
<expr2>,..., <exprn> ]

DATA

Crea dato numrico o de texto

DB

Declara dato de un byte

DE

Declara dato de EEPROM

DT

Define tabla

DW

Declara dato de una palabra

ENDC
FILL
__IDLOCS
__MAXRAM
RES

Fin de bloque de constantes automticas


Especifica valor de llenado de memoria fill
Pon localidades de identificacin (ID)
Especifica mxima direccin de RAM
Reserva memoria

data <expr>, [ ,<expr>,...,


<expr> ]
db <expr>, [ ,<expr>,...,
<expr> ]
de <expr>, [ ,<expr>,...,
<expr> ]
dt <expr>, [ ,<expr>,...,
<expr> ]
dw <expr>, [ ,<expr>,...,
<expr> ]
endc
<expr>, <count>
_ _idlocs <expr>
_ _maxram <expr>
res <mem_units>

Opciones de listado
Apaga el listado de salida
Inserta un salto de pgina en el listado
Inserta lneas en blanco en el listado
Especifica subttulo del programa
Especifica titulo del programa

list [<option>[,...,<option>] ]
nolist
page
space [<expr>]
subtitle <sub_text>
title <title_text>

Definicin del fin de un Macro


Salida de un Macro
Expande el listado del Macro
Declaracin local de Macro variable
Declaracin de definicin de Macro
Apaga expansin del Macro

endm
exitm
expand
local <etiqueta> [, <etiqueta>]
<etiq> macro [<arg>,..., <arg>]
noexpand

LISTADO
LIST
NOLIST
PAGE
SPACE
SUBTITLE
TITLE
MACRO
ENDM
EXITM
EXPAND
LOCAL
MACRO
NOEXPAND

ARCHIVO OBJETO
Genera cdigo seleccionando
bankisel <etiqueta>
Indirectamente en el banco
BANKSEL
Genera banco de RAM seleccionando
bankisel <etiqueta>
el cdigo
CODE
Inicia seccin de cdigo ejecutable
[<nombre> code <direccin>]
EXTERN
Declara una etiqueta externa
extern <etiqueta> [, <etiqueta>]
GLOBAL
Exporta una etiqueta definida
extern <etiqueta> [, <etiqueta>]
IDATA
Inicia seccin de datos inicializados
[<nombre> idata <direccin>]
PAGESEL
Genera cdigo (ROM) en pg selecc.
pagesel <etiqueta>
UDATA
Inicia seccin de datos no inicializados
[<nombre> udata <direccin>]
UDATA_ACS Inicia seccin de acceso de datos no inic. [<nombre> udata_acs <direccin>]
UDATA_OVR Inicia seccin de encimamiento de datos
[<nombre> udata_ovr <direccin>]
UDATA_SHR Inicia seccin compartida de datos no inic. [<nombre> udata_shr <direccin>]
BANKISEL

Cuando se escriban Macros, se podrn usar cualquiera de estas directivas ms cualquier otra
directiva soportada por el ensamblador.

301

Substitucin de texto
El reemplazo de las cadenas de caracteres (strings) y la evaluacin de las expresiones podrn
aparecer dentro del cuerpo de un Macro.
Comando

Descripcin

<arg>

Sustituye el argumento de texto proporcionado como parte de la


invocacin del Macro.

#v (<expr>)

Regresa el valor entero de <expr>. Tpicamente, es usado para


crear nombres de variables nicas con prefijos o sufijos comunes. No
podr ser usada en directivas de ensamble condicional (IFDEF,
WHILE).

Los argumentos podrn ser usados en cualquier lugar dentro del cuerpo del Macro, excepto
como parte de la expresin normal. Por ejemplo, el siguiente Macro:
define_table

macro
local
a=0
while a < 3
dw
0

entry#v(a)
a += 1

endw
endm

Cuando sea invocado generar:


entry0
entry1
entry2
entry3

dw
dw
dw
dw

0
0
0
0

Forma de usar el Macro


Una vez que el Macro ha sido definido, ste podr ser invocado en cualquier punto dentro del
mdulo fuente mediante el uso de una llamada al Macro, como se describe a continuacin:
<macro_name> [<arg>, ..., <arg>]
donde <macro_name> es el nombre de un Macro previamente definido y los argumentos son
remplazados como sea requerido.
La llamada del Macro, por si misma no ocupar ninguna localidad en memoria. Sin embargo, la
expansin del Macro comenzar en la localidad actual de memoria. Comas podrn usarse
para reservar una posicin del argumento. En este caso, el argumento ser una cadena de
caracteres (string) vaco. La lista de argumentos ser terminada con un espacio en blanco o un
caracter : (semicolon).
La directiva EXITM proporciona un mtodo alternativo para terminar una expansin de un
Macro. Durante una expansin de un Macro, esta directiva causar la terminacin de la
expansin del Macro actual, y todo el cdigo existente entre las directivas EXITM y ENDM en
este Macro, ser ignorado. Si los Macros estuvieran anidados, EXITM causara a la generacin
del cdigo, el regresar al nivel previo de la expansin del Macro.

302

A continuacin se presentan en forma detallada y con ejemplos, todas y cada una de las
directivas de Macros.

CONSTANT (Declara smbolo constante)


Constant

<etiqueta>

[..., <etiqueta> = <expr>]

Descripcin
Crea smbolos para usarse en expresiones del ensamblador MPASM. Las constantes no
podrn ser borradas (reset) una vez que hayan sido inicializadas, y la expresin deber ser
resuelta completamente en el momento de la asignacin. Esta es la principal diferencia entre
los smbolos declarados como constantes y aquellos declarados como variables, o creados por
la directiva SET. De otra manera, las constantes y las variables podrn ser usadas
intercambiablemente en las expresiones.
Ejemplo
Variable

RecLength = 64

; pon el valor de default


; de RecLength
; Inicializa BufLength
; RecLength podr ser
; reasignado reset ms tarde
; en RecLength = 128

constant

BufLength = 512

constant

MaxMem = RecLength + BufLength

; Calcula memoria mxima

#DEFINE (Define una etiqueta de sustitucin de texto)


#define <nombre>

[<string>]

Descripcin
Esta directiva define una cadena de caracteres (string) de substitucin de texto. Donde sea que
<nombre> sea encontrado en el cdigo de ensamblador, <string> ser sustituido. Usando la
directiva sin <string> causar que una definicin de <nombre> sea notado internamente y
podra ser probada con la directiva IFDEF.
Ejemplo
#define length
#define control
#define position
:
:
test_label
dw
bsf

20
0x19, 7
(X, Y, Z)

(Y (2 * Z + X))

position (1, length, 512)


control

; Enciende bit 7 en registro 0x19

303

END (Fin de bloque de programa)


end
Descripcin
Esta directiva indica el fin del programa.
Ejemplo
list

p=17c42

:
:

; cdigo ejecutable

end

; Fin de las instrucciones

EQU (Define una constante del ensamblador)


<etiqueta>

equ

<expr>

Descripcin
El valor de <expr> es asignado a <label>.
Ejemplo
four

equ

; El valor numrico de 4 es asignado


; a la etiqueta four

ERROR (Edita un mensaje de error)


error

<text_string>

Descripcin
<text_string> ser impresa en un formato idntico a cualquier mensaje de error del
ensamblador MPASM. <text_string> podr ser de 1 a 80 caracteres.
Ejemplo
error_checking macro
if
endm

endif

arg1

arg1 >= 55
; Si arg esta fuera de rango
error error_checking-01 esta fuera de rango

304

ERRORLEVEL (Determina el nivel de mensajes)


errorlevel

(0 | 1 | 2 | +<msgnum> | -<msgnum>) [, ....]

Descripcin
Determina el nivel del mensaje que ser impreso en el archivo de listado y el archivo de error.
Nivel
0
1
2
-<msgnum>
+<msgnum>

Afectacin
Mensajes, advertencias y errores impresos
Advertencias y errores impresos
Errores impresos
Inhibe la impresin de mensajes <msgnum>
Habilita la impresin de mensajes <msgnum>

Los mensajes de errores no podrn ser deshabilitados. Los niveles de 0, 1 y 2 anulan los
mensajes individuales deshabilitndolos o habilitndolos.
Ejemplo
errorlevel

1, -202

#INCLUDE (Incluye archivo fuente adicional)


#include

<include_file>

Descripcin
El archivo especificado ser ledo como un cdigo fuente. El efecto es el mismo como si el
texto completo del archivo include fuera insertado dentro del archivo en la posicin de la
directiva. Hasta el final del archivo (end-of-file), el ensamblado del cdigo fuente resumir
desde el archivo fuente original. Hasta seis niveles de anidamiento y hasta 256 archivos
include sern permitidos.
<include_file> podr ser encerrado entre comillas o entre parntesis angulares (<>). Si una
trayectoria vlida fuese especificada, nicamente esa trayectoria sera buscada. De otra
manera, el orden de bsqueda ser: Directorio de trabajo actual, directorio del archivo fuente,
directorio del MPASM ejecutable.
Ejemplo
#include
#include

c:\sys\sysdefs.inc
<regs.h>

; definiciones del sistema


; definiciones de los registros

305

MESSG (Crea un mensaje definido por el usuario)


messg

<message_text>

Descripcin
Causa un mensaje informal para ser impreso en el archivo de listado. El texto del mensaje
podr ser de hasta 80 caracteres. Poniendo la directiva messg no regresar ningn cdigo de
error.
Ejemplo
mssg_macro

macro
messg

endm

mssg_macro-001 invocado sin argumento

ORG (Pon la direccin de origen del programa)


<etiqueta>

org

<expr>

Descripcin
Pone el origen del programa para el cdigo subsiguiente en la direccin definida en <expr>. Si
<etiqueta> fuese especificada, a esta se le asignar el valor de <expr>. Si no se especificara la
directiva ORG, la generacin del cdigo comenzara en la direccin 0x0000.
Esta directiva no podr ser utilizada cuando se genere un archivo objeto (object file).
Ejemplo
int_1

org

0x20

; Vector 20, el cdigo va aqu


int_2

org

int_1 + 0x10

; Vector 30, el cdigo va aqu

PROCESSOR (Pon el tipo de procesador)


processor

<processor_type>

Descripcin
Pone el tipo de procesador a <processor_type>.
Ejemplo
processor

16C54

306

RADIX (Especifica la base (raz) a usar)


radix

<default_radix>

Descripcin
Pone la base (radix) de default para expresiones de datos. El default es hex. Valores vlidos
de base son:
hex hexadecimal (base 16)
dec decimal (base 10)
oct octal (base 8)
bin binario (base 2)
ASCII
Las constantes podrn ser opcionalmente precedidas por un signo + o un signo -. Si no se
especifica ningn signo, se asumir que el valor es positivo. Existen varias maneras de
especificar una base:
Tipo
Decimal

Sintaxis
D<digitos>
. <dgitos>

Ejemplo
D100
.100

Hexadecimal

H<digitos_hex>
0x<dgitos>

H9F
0x9F

Octal

O<digitos_octal>

O777

Binario

B< dgitos _ binario>

B00111001

ASCII

A<caracter>
<caracter>

AC
C

Ejemplo
radix

dec

SET (Define una variable de ensamblador)


<etiqueta>

set

<expr>

Descripcin
A <etiqueta> le es asignado el valor de una expresin de MPASM vlida especificada por
<expr>. La directiva SET es funcionalmente equivalente a la directiva EQU excepto que los
valores de SET podrn ser alternados subsecuentemente por otras directivas SET.
Ejemplo
rea
ancho
longitud
rea
longitud

set
set
set
set
set

0
0x12
0x14
longitud * ancho
longitud + 1

307

#UNDEFINE (Borra una substitucin de etiqueta)


#define <etiqueta>
Descripcin
<etiqueta> es un identificador previamente definido con la directiva #define. Deber ser una
etiqueta de MPASM vlida. El smbolo nombrado ser removido de la tabla de smbolos.
Ejemplo
#define
:
:
#undefine

longitud 20
longitud

VARIABLE (Declara un smbolo de variable)


variable <etiqueta> [=<expr>] [, <etiqueta> [=<expr>]...]
Descripcin
Crea smbolos para ser usados en expresiones MPASM. Las variables y las constantes podrn
ser intercambiadas en las expresiones.
La directiva VARIABLE crear un smbolo que ser funcionalmente equivalente a las creadas
por la directiva SET. La diferencia radica en que la directiva VARIABLE no requerir que los
smbolos sean inicializados cuando sean declarados.
Los valores de las variables no podrn ser actualizados dentro de un operando. Se deber
poner asignaciones a la variable, incrementos y decrementos en lneas separadas.
Ejemplo
Refirase al ejemplo dado en la directiva CONSTANT.

ELSE (Inicio de bloque de ensamble alternativo a IF)


else
Descripcin
Utilizado en conjuncin con la directiva IF para proporcionar una trayectoria alternativa de
cdigo de ensamblador. Cuando la directiva IF se evale como falsa, el cdigo de programa o
Macro dentro del bloque ELSE ser utilizado.
Ejemplo
speed

macro rate
if rate < 50
dw slow

308

else
endm

endif

dw fast

ENDIF (Fin de bloque de ensamble condicional)


endif
Descripcin
Esta directiva marca el final del bloque de ensamble condicional (if). La directiva ENDIF podr
ser utilizada dentro de un bloque de programa regular o Macro.

ENDW (Fin de bloque de la directiva While)


endw
Descripcin
Esta directiva termina un bloque WHILE. Mientras la condicin especificada por la directiva
WHILE permanezca verdadera (true), el cdigo fuente entre la directiva WHILE y la directiva
ENDW ser repetidamente expandido en el cdigo fuente del ensamblador. Esta directiva
podr ser utilizada dentro de un bloque de programa regular o Macro.
Ejemplo
Ver el ejemplo de la directiva WHILE.

IF (Inicio de bloque de cdigo condicionalmente ensamblado)


if <expr>
Descripcin
Inicia la ejecucin de un bloque condicionalmente ensamblado. Si <expr> resultara ser
verdadera (true) el cdigo inmediatamente seguido al IF ser ensamblado, de lo contrario, el
cdigo del IF ser saltado hasta que la directiva ELSE o la directiva ENDIF sea encontrada.
Una expresin que sea evaluada a cero ser considerada lgicamente como FALSA (false).
Una expresin que sea evaluada diferente a cero ser considerada lgicamente como
VERDADERA (true). Las directivas IF y WHILE operan sobre valores lgicos de una expresin.
Una expresin cuya relacin sea VERDADERA regresar un valor diferente de cero y una
FALSA regresar un valor de cero.
Ejemplo
if versin == 100
movlw 0x0A
movwf
io_1

; Verifica versin actual

309

else
endif

movlw
movwf

0x0A
io_2

IFDEF (Ejecuta si el smbolo ha sido definido)


ifdef <etiqueta>
Descripcin
Si la <etiqueta> ha sido previamente definida, usualmente mediante la edicin de la directiva
#define, la trayectoria condicional ser tomada. El ensamble continuar hasta que sea
encontrada la directiva ELSE o la directiva ENDIF.
Ejemplo
#define prueba 1
:
:
ifdef
prueba
<ejecuta cdigo de prueba>
endif

; esta trayectoria deber


; ser ejecutada

IFNDEF (Ejecuta si el smbolo no ha sido definido)


ifndef <etiqueta>
Descripcin
Si la <etiqueta> no ha sido previamente definida, o ha sido indefinida mediante la edicin de la
directiva #undefine, la trayectoria condicional ser tomada. El ensamble continuar hasta que
sea encontrada la prxima directiva ELSE o la directiva ENDIF.
Ejemplo
#define
:
#undefine
:
ifndef

endif

prueba 1

; Enciende prueba

prueba

; Apaga prueba

prueba

; Si no esta en modo prueba

<ejecuta cdigo >

; esta trayectoria deber


; ser ejecutada

310

WHILE (Ejecuta Loop While si condicin es cierta)


while <expr>
:
:
endw
Descripcin
Las lneas entre la directiva WHILE y la directiva ENDW sern ensambladas mientras que
<expr> sea evaluada como VERDADERA (true).
Una expresin que sea evaluada a cero ser considerada lgicamente como FALSA (false).
Una expresin que sea evaluada diferente a cero ser considerada lgicamente como
VERDADERA (true). Una expresin cuya relacin sea VERDADERA regresar un valor
diferente de cero y una FALSA regresara un valor de cero.
Un Loop While no podr contener ms de 100 lneas y repetirse ms de 256 veces.
Ejemplo
test_mac
i=0
i += 1

macro

count

variable

while
movlw

i < count
i

endw
endm

start

test_mac
end

_ _BADRAM (Identifica RAM no implementada)


Nota:

Badram es precedido de dos caracteres underline, sin ningn espacio entre ellos.
Aqu se agreg un espacio para fines de clarificar.

_ _badram <expr>[-<expr>] [, <expr>[-<expr>] ]


Descripcin
Las directivas _ _MAXRAM y _ _BADRAM juntas abanderan accesos a registros no
implementados. Es decir, _ _BADRAM define las localidades de memoria invlidas. Esta
directiva fu diseada para usarse con la directiva _ _MAXRAM, la cual deber proseguir
cualquier directiva _ _BADRAM. Cada <expr> deber ser menor o igual al valor especificado
por _ _MAXRAM. Una vez que la directiva _ _MAXRAM sea utilizada, la verificacin estricta de
direcciones RAM ser habilitada, utilizando el mapa de RAM especificado por la directiva _
_BADRAM. Para especificar un rango de localidades invlidas, utilice la sintaxis <minloc> <maxloc>.
Ejemplo

311

Ver el ejemplo de la directiva _ _maxram.

CBLOCK (Define un bloque de constantes)


cblock [ <expr>]
<etiqueta> [:<incremento>] [, <etiqueta> [:<incremento>] ]
endc
Descripcin
Define una lista de constantes nombradas. A cada <etiqueta> se le asignar un valor de uno
mayor que la <etiqueta> previa. El propsito de esta directiva es el de asignarles direcciones
(offsets) a muchas etiquetas. La lista de nombres terminar cuando sea encontrada la directiva
ENDC.
<expr> indicar el valor inicial para el primer nombre en el bloque. Si no fuese encontrada
ninguna expresin, el primer nombre recibira un valor uno ms alto que el nombre final en el
bloque CBLOCK previo. Si el primer bloque CBLOCK en el archivo fuente no tuviera expresin
(<expr>), les asignara valores iniciando con cero.
Si <incremento> fuese especificado, entonces la prxima etiqueta se le asignara el valor del
<incremento> ms alto que la <etiqueta>l previa.
Mltiples nombres podrn ser proporcionados sobre una lnea, separados por comas.
La directiva CBLOCK es til para definir constantes en la memoria de programa y de datos.
Ejemplo
cblock

0x20

; a nombre_1 ser asignado 20

nombre_1, nombre_2
nombre_3, nombre_4

; a nombre_2, asignado 21
; a nombre_4, asignado 23

endc

_ _CONFIG (Pon bits de configuracin)


Nota:

CONFIG es precedido de dos caracteres underline, sin ningn espacio entre ellos.
Aqu se agreg un espacio para fines de clarificar.

_ _config <expr>

_ _config <addr>, <expr>

Descripcin
Pone los bits de configuracin del procesador al valor descrito por <expr>. Para la familia de
microcontroladores PIC18Cxxx, la direccin del byte de configuracin vlido deber tambin
ser especificado por <addr>.
Ejemplo

312

list

p=17c42, f=INHX32

_ _config

hFFFF ; Bits de configuracin (default)

DA (Almacena cadena de caracteres (string) en memoria de programa)


<etiqueta>

da

<expr> [, <expr2>,..., <exprn>]

Descripcin
Genera un nmero de 14 bits representando dos caracteres ASCII de 7 bits cada uno. Esto es
til para almacenar cadenas de caracteres (strings) en la memoria para microcontroladores con
memoria FLASH.
Ejemplo
da
abcdef
pondr 30E2 31E4 32E6 3380 dentro de la memoria de programa.
da
12345678, 0
pondr 18B2 19B4 1AB6 0000 dentro de la memoria de programa.
da
0xFFFF
pondr 0x3FFF dentro de la memoria de programa.

DATA (Crea dato numrico o de texto)


<etiqueta>
<etiqueta>

data
data

<expr>, [, <expr>,..., <expr>]


<text_string> [, <text_string>,...]

Descripcin
Inicializa una o ms palabras de la memoria de programa con datos. El dato deber estar en
forma de constantes, etiquetas relocalizables o externas, o expresiones. El dato podr tambin
consistir de una cadena de caracteres ASCII, <text_string>, cadena de texto encerrada en
comilla sencilla para un caracter o comillas dobles para una cadena (string). Los caracteres
sencillos son puestos en el byte bajo de la palabra, mientras que una cadena de caracteres
sern empacados dos en una palabra. Si un nmero impar de caracteres fuese dado en una
cadena de caracteres, el byte final sera cero.
Ejemplo
data
data
data
data
data

reloc_label + 10
1, 2, ext_label
probando 1, 2, 3
N
start_of_program

; constantes
; constantes, externas
; cadena de texto
; caracter sencillo
; etiqueta relocalizable

313

DB (Declara dato de un byte)


<etiqueta>

db

<expr>, [, <expr>,..., <expr>]

Descripcin
Reserva palabras en la memoria de programa con valores empaquetados en 8 bits.
Expresiones mltiples continuarn llenando bytes consecutivamente hasta el fin de las
expresiones. Si hubiera un nmero impar de expresiones, el ltimo byte sera cero.
Cuando sea generado un archivo objeto, esta directiva podra tambin ser utilizada para
declarar valores de datos inicializados. Refirase a la directiva IDATA para ms informacin.
Ejemplo
db

t, 0x0f, e, 0x0f, s, 0x0f, t, \n

DE (Declara dato de EEPROM)


<etiqueta>

db

<expr>, [, <expr>,..., <expr>]

Descripcin
Reserva palabras en la memoria con datos de 8 bits. Las expresiones <expr> debern ser
evaluadas a un valor de 8 bits. Los bits ms significantes de la palabra de programa sern
ceros. Cada caracter en una cadena ser almacenada en una palabra separada.
Cuando sea usada la directiva DE, asegurese de especificar el inicio de la memoria de datos
en 0x2100 (org H2100) para uso con programadores.
Aunque esta directiva fu diseada para inicializar datos en la memoria EEPROM para el
microcontrolador PIC16x8x, la directiva podr ser usada para cualquier localidad en cualquier
microcontrolador.
Ejemplo
org

H2100

; Inicializa datos de EEPROM

de

Mi programa, v1.0,0

DT (Define tabla)
<etiqueta>

dt

<expr>, [, <expr>,..., <expr>]

Descripcin
Genera una serie de instrucciones RETLW, una instruccin por cada <expr>. Cada <expr>
deber ser un valor de 8 bits. Cada caracter en una cadena ser almacenado en su propia
instruccin RETLW.
Ejemplo

314

dt
dt

Un mensaje, 0
PrimerValor, SegundoValor

DW (Declara dato de una palabra)


<etiqueta>

dw

<expr>, [, <expr>,..., <expr>]

Descripcin
Reserva en la memoria de programa palabras para datos, inicializando ese espacio con valores
especficos. Los valores son almacenados en localidades de memoria sucesivas y el contador
de localidades es incrementado por uno. Las expresiones debern ser cadenas de letras y
almacenados de acuerdo a lo descrito en la directiva DATA.
Cuando se genere un archivo objeto, esta directiva podra tambin ser usada para declarar
valores de datos inicializados. Refirase a la directiva IDATA para ms informacin.
Ejemplo
dw
dw

39, diagnstico 39, (d_list+d_offset)


diagbase-1

ENDC (Fin de bloque de constantes automticas)


endc
Descripcin
ENDC terminar la lista de CBLOCK. Esta directiva deber ser proporcionada para terminar la
lista.

FILL (Especifica valor de llenado de memoria)


<etiqueta>

fill

<expr>, <contador>

Descripcin
Genera un nmero de bytes o palabras de programa especificado por el <contador>. El valor
del byte o palabra ser especificado en <expr>. Si se encierra entre parntesis, <expr> podr
ser una instruccin de ensamblador.
Ejemplo
fill

0x1009, 5

; Llena con una constante

fill

(GOTO RESET_VECTOR), NEXT_BLOCK-$

315

_ _IDLOCS (Pon localidades de identificacin (ID))


Nota:

IDLOCS es precedido de dos caracteres underline, sin ningn espacio entre ellos.
Aqu se agreg un espacio para fines de clarificar.

_ _idlocs

<expr> o

_ _idlocs

<expr1>, <expr2>

Descripcin
Para los microcontroladores PIC12Cxxx y PIC16Cxx, la directiva _ _IDLOCS pondr a las
localidades de identificacin (ID) con el valor hexadecimal de <expr>.
Por ejemplo, si <expr> fuese valuada a 1AF, la primera localidad de identificacin (la direccin
ms baja) a cero., la segunda a uno, la tercera a diez y la cuarta a quince.
Antes de que esta directiva sea utilizada, deber declararse la directiva LIST o la directiva
PROCESSOR.
Ejemplo
_ _idlocs

H1234

_ _MAXRAM (Especifica mxima direccin de RAM)


Nota:

MAXRAM es precedido de dos caracteres underline, sin ningn espacio entre ellos.
Aqu se agreg un espacio para fines de clarificar.

_ _maxram

<expr>

Descripcin
Las directivas _ _MAXRAM y _ _BADRAM juntas abanderan accesos a registros no
implementados. La directiva _ _MAXRAM define la direccin mxima absoluta de RAM vlida
e inicializa el mapa de direcciones vlidas de RAM a partir de <expr>. <expr> deber ser mayor
o igual a la direccin de RAM mxima de la pgina 0 y menor que 1000h. Esta directiva fu
diseada para usarse con la directiva _ _BADRAM. Una vez que la directiva _ _MAXRAM sea
utilizada, la verificacin estricta de direcciones RAM ser habilitada, utilizando el mapa de RAM
especificado por la directiva _ _BADRAM.
_ _MAXRAM podr ser usado ms de una vez en un archivo fuente. Cada uso redefine la
direccin vlida mxima en RAM e inicializa (reset) el mapa de RAM de todas las localidades.
Ejemplo
_ _maxram
_ _badram
_ _badram
movwf
movwf

H0BF
H07 H09, H0D H1E
H87 H89, H8D, H8F H9E
H07
H87

; genera una advertencia de RAM invlida


; genera una advertencia de RAM invlida
; y truncacin del mensaje

316

RES (Reserva memoria)


<etiqueta>

res

<mem_units>

Descripcin
Esta directiva causar que el puntero de la memoria avance el nmero de localidades
expresado en <mem_units>. En cdigo no relocalizable, <etiqueta> se asume que es una
direccin de la memoria de programa. En cdigo relocalizable (utilizando el encadenador
MPLINK), la directiva RES podr tambin ser usada para reservar memoria para almacenar
datos.
Las direcciones de las localidades sern definidas en palabras de 12, 14 y 16 bits de acuerdo
al modelo de microcontrolador.
Ejemplo
buffer

res

64

; Reserva 64 localidades para almacenamiento

LIST (Opciones de listado)


list

[<list_options>,..., <list_options>]

Descripcin
Esta directiva tiene el efecto de activar el listado de salida, si este ha sido previamente
desactivado. De otra manera, una de las siguientes opciones de la directiva LIST podra ser
proporcionada para controlar el proceso de ensamble o formato del archivo del listado.
Opciones de la directiva LIST
Opcin
b=nnn
c=nnn
f=<format>

Default
8
132
INHX8M

free

FIXED

fixed

FIXED

mm = (ON|OFF)

On

n=nnn
p=<type>

60
None

r=<radix>
st = (ON|OFF)

hex
On

t = (ON|OFF)
w = (0|1|2)
x = (ON|OFF)

Off
0
On

Descripcin
Espacios del TABulador
Ancho de la columna
Salida del archivo hex. El formato
podr ser INHX32, INHX8M o INHX8S
Uso del divisor de textos (parser) en
formato libre.
Uso del divisor de textos (parser) en
formato fijo.
Imprime mapa de memoria en el
archivo de listado.
Nmero de lneas por pgina.
Tipo de procesador, por ejemplo
PIC16C54.
Base (radix).
Imprime la tabla de smbolos en el
archivo de listado.
Trunca las lneas del listado.
Nivel de mensaje. Ver ERRORLEVEL
Expansin de Macros habilitada o
deshabilitada.

317

Nota:

Todas las opciones de la directiva LIST son evaluadas como nmeros decimales.

Ejemplo
list

p=17c42, f=INHX32, r=DEC

NOLIST (Apaga el listado de salida)


nolist
Descripcin
Esta directiva desactiva la salida en el archivo de listado.

PAGE (Inserta un salto de pgina en el listado)


page
Descripcin
Esta directiva inserta un salto de pgina en el archivo de listado.

SPACE (Inserta lneas en blanco en el listado)


space <expr>
Descripcin
Esta directiva inserta un nmero de lneas en blanco especificadas por <expr> en el archivo de
listado.
Ejemplo
space 3

; Inserta tres lneas en blanco

SUBTITLE (Especifica subtitulo del programa)


subtitle <sub_text>
Descripcin
<sub_text> es una cadena (string) de caracteres ASCII encerrada en dobles comillas, y deber
ser de mximo 60 caracteres de longitud. Esta directiva establece una segunda lnea de
encabezado como un subttulo en el listado de salida.
Ejemplo
subtitle Seccin de diagnstico

318

TITLE (Especfica titulo del programa)


title

<title_text>

Descripcin
<title_text> es una cadena (string) de caracteres ASCII encerrada en dobles comillas, y deber
ser de mximo 60 caracteres de longitud. Esta directiva establece una lnea de encabezado en
la primera lnea de cada pgina como un ttulo en el listado de salida.
Ejemplo
title Cdigo operacional, rev 5.0

ENDM (Definicin del fin de un Macro)


endm
Descripcin
Termina una definicin de un Macro iniciada con la directiva MACRO.
Ejemplo
make_table

macro arg1, arg2


dw
res

arg1, 0
arg2

; el caracter null termina el nombre de la tabla


; reserva almacenamiento

endm

EXITM (Salida de un Macro)


exitm
Descripcin
Esta directiva forzar a regresar de la expansin del Macro durante el ensamble. El efecto es el
mismo al de la directiva ENDM.
Ejemplo
test

macro filereg
if
else

endm

endif

filereg == 1
exitm

; Verifica por un archivo vlido

error Asignacin de archivo incorrecta

319

EXPAND (Expande el listado del Macro)


expand
Descripcin
Esta directiva expandir todos los Macros en el archivo de listado. Esta directiva podr ser
deshabilitada mediante la directiva NOEXPEND.

LOCAL (Declaracin local de Macro variable)


local

<etiqueta> [, <etiqueta>,...]

Descripcin
Esta directiva declara que los elementos de datos especificados sern considerados en un
contexto local al Macro. <etiqueta> podr ser idntica a otras etiquetas declaradas fuera de la
definicin del Macro sin que exista un conflicto entre las dos.
Si el Macro es llamado recursivamente, cada invocacin tendr su propia cpia local.
Ejemplo
<Segmento del cdigo principal>
:
len
equ
10
; versin global
size
equ
20
; note que una variable local
; podr ser creada y modificada
test
macro size
local len, label
; variable local: len y label
len
set
size
; modifica variable local len
label res
len
; reserva memoria (buffer)
len
set
len-20
endm

MACRO (Declaracin de definicin de Macro)


<etiqueta>

macro

[<arg>,..., <arg]

Descripcin
Un Macro es una secuencia de instrucciones que podrn ser insertadas en el cdigo fuente del
ensamblador mediante el uso de una sola llamada a un Macro. El Macro deber primero ser
definido y posteriormente podr ser referido por un cdigo fuente subsiguiente.
Un Macro podr llamar a otro Macro o llamarse a si mismo recursivamente.
Refirase a la seccin de Macro lenguaje para ms informacin.
Ejemplo

320

Read

endm

macro
movlw
movwf
movlw
movwf
movlw
call

device, buffer, count


device
ram_20
buffer
ram_21
count
sys_21

; direccin del buffer


; byte count
; llamada a la subrutina sys_21

NOEXPAND (Apaga expansin del Macro)


noexpand
Descripcin
Esta directiva apagar todos los Macros de expansin en el archivo de listado.

BANKISEL (Genera cdigo seleccionando indirectamente el banco)


bankisel

<etiqueta>

Descripcin
Para ser usada cuando se genere un archivo objeto. Esta directiva es una instruccin al
encadenador (linker) para generar el cdigo de seleccin apropiada del banco para un acceso
indirecto de la direccin especificada por <etiqueta>. Solamente una etiqueta deber ser
especificada. Ninguna operacin podr ser ejecutada sobre <etiqueta>, la cual debi haber
sido previamente definida.
El encadenador (linker) generar el cdigo de seleccin del banco apropiado. Para
microcontroladores de 14 bits, las apropiadas instrucciones para encender/apagar el bit IRP en
el registro STATUS ser generada. Para los microcontroladores de 16 bits, la instruccin
MOVLB o MOVLR ser generada. Si el usuario pudiera completamente especificar la direccin
indirecta sin esas instrucciones, ningn cdigo se generar.
Para ms informacin, refirase a la seccin Creando objetos relocalizables.
Ejemplo
movlw
movwf

Var1
FSR

bankisel
:
movf

Var1
INDF

BANKSEL (Genera cdigo seleccionando el banco)


banksel <etiqueta>

321

Descripcin
Para ser usada cuando se genere un archivo objeto. Esta directiva es una instruccin al
encadenador (linker) para generar el cdigo de seleccin del banco, con el banco contenido en
<etiqueta>. Solamente una etiqueta deber ser especificada. Ninguna operacin podr ser
ejecutada sobre <etiqueta>, la cual debi haber sido previamente definida.
El encadenador (linker) generar el cdigo de seleccin del banco apropiado. Para
microcontroladores de 12 bits, las apropiadas instrucciones para encender/apagar sobre el
registro FSR ser generada. Para microcontroladores de 14 bits, las apropiadas instrucciones
para encender/apagar el bit IRP en el registro STATUS ser generada. Para los
microcontroladores de 16 bits, la instruccin MOVLB o MOVLR ser generada. Si el
microcontrolador tuviera nicamente un banco de RAM, ningn cdigo de instrucciones se
generar.
Para ms informacin, refirase a la seccin Creando objetos relocalizables.
Ejemplo
banksel Var1
movf

Var1

CODE (Inicia seccin de cdigo de archivo objeto)


<etiqueta>

code

[<ROM address>]

Descripcin
Para ser usada cuando se genere un archivo objeto. Esta directiva declara el inicio de una
seccin de cdigo de programa. Si <etiqueta> no fuese especificada, la seccin sera
nombrada .code. La direccin inicial ser inicializada en la direccin especificada o ser
asignada en el momento del encadenamiento (link) si no fuera especificada ninguna direccin.
Nota:

Dos secciones en el mismo archivo fuente no podrn tener el mismo nombre.

Para ms informacin, refirase a la seccin Creando objetos relocalizables.


Ejemplo
RESET code

H01FF
goto
START

EXTERN (Declara una etiqueta externamente definida)


extern

<etiqueta> [,<etiqueta>...]

Descripcin
Para ser usada cuando se genere un archivo objeto. Esta directiva declara nombres de
smbolos que podrn ser utilizados en el mdulo corriente pero son definidas como globales en
un diferente mdulo. La directiva EXTERN deber ser incluida antes de que la <etiqueta> sea
utilizada. Al menos una etiqueta deber ser especificada sobre la lnea. Si <etiqueta> fuese

322

definida en el mdulo corriente, el ensamblador MPASM generara un error de etiqueta


duplicada.
Para ms informacin, refirase a la seccin Creando objetos relocalizables.
Ejemplo
extern
:
call

Funcin
Funcin

GLOBAL (Exporta una etiqueta definida)


global

<etiqueta> [,<etiqueta>...]

Descripcin
Para ser usada cuando se genere un archivo objeto. Esta directiva declara nombres de
smbolos que son definidas en el mdulo corriente y sern disponibles a otros mdulos. La
directiva EXTERN deber ser incluida antes de que la <etiqueta> sea utilizada. Al menos una
etiqueta deber ser especificada sobre la lnea.
Para ms informacin, refirase a la seccin Creando objetos relocalizables.
Ejemplo
udata
res
res
global
code
SumaTres
global
addlw
return

Var1
Var2

1
1
Var1, Var2
SumaTres
3

IDATA (Inicia seccin de datos inicializados)


<etiqueta>

idata

[<RAM address>]

Descripcin
Para ser usada cuando se genere un archivo objeto. Esta directiva declara el inicio de una
seccin de datos inicializados. Si <etiqueta> no fuese especificada, la seccin sera nombrada
.idata. La direccin de inicio ser inicializada con la direccin especificada o ser asignada en
el momento del encadenamiento (link) si ninguna direccin fuera especificada. Ningn cdigo
podr ser generado en este segmento.
El encadenador (linker) generar una tabla de entradas para cada byte especificado en la
seccin IDATA. Deber entonces encadenarse (link) o incluir el cdigo de inicializacin
apropiado. Ejemplos del cdigo de inicializacin que podrn ser usados y modificados de

323

acuerdo a sus necesidades podrn ser encontrados en los ejemplos de aplicaciones de


muestra en el prximo captulo MPLINK.
Nota:

Esta directiva no es disponible para microcontroladores de 12 bits.


Las directivas RES, DB y DW podrn ser utilizadas para reservar espacio para las
variables. La directiva RES generar un valor inicial de cero. La directiva DB inicializar
bytes sucesivos de RAM. La directiva DW inicializar bytes sucesivos de RAM, una
palabra a la vez, en el orden byte-bajo/byte-alto.

Para ms informacin, refirase a la seccin Creando objetos relocalizables.


Ejemplo
LimitL
LimitH
Gain
Flags
String

idata
dw
dw
dw
db
db

0
D300
D5
0
Hola, que tal

PAGESEL (Genera cdigo en pgina seleccionada)


pagesel

<etiqueta>

Descripcin
Para ser usada cuando se genere un archivo objeto. Esta directiva instruye al encadenador
(linker) para generar el cdigo en una pgina seleccionada poniendo los bits de pgina
contenidos en <etiqueta>. Solamente una <etiqueta> podr ser especificada. Ninguna
operacin podr ser ejecutada sobre <etiqueta>, la cual debi haber sido definida previamente.
El encadenador (linker) generar el cdigo de seleccin de pgina apropiado. Para
microcontroladores de 12 bits, las instrucciones apropiadas para encender/apagar sobre el
registro STATUS ser generada. Para microcontroladores de 14 y 16 bits, las instrucciones
MOVLW y MOVWF sern generadas para modificar PCLATH. Para los microcontroladores de
16 bits, la instruccin MOVLB o MOVLR ser generada. Si el microcontrolador tuviera
nicamente una pgina de memoria de programa, ningn cdigo de instrucciones se generar.
Para microcontroladores de la familia PIC18Cxx, este comando no har nada.
Para ms informacin, refirase a la seccin Creando objetos relocalizables.
Ejemplo
pagesel GotoDest
goto
GotoDest
:
pagesel CallDest
call
CallDest

324

UDATA (Inicia seccin de datos no inicializados)


<etiqueta>

udata

[<RAM address>]

Descripcin
Para ser usada cuando se genere un archivo objeto. Esta directiva declara el inicio de una
seccin de datos no inicializados. Si <etiqueta> no fuese especificada, la seccin sera
nombrada .udata. La direccin inicial ser inicializada con la direccin especificada o ser
asignada en el momento del encadenamiento (link) si ninguna direccin fuese especificada.
Ningn cdigo ser generado en este segmento. La directiva RES ser usada para reservar
espaci para datos.
Nota:

Dos secciones en el mismo archivo fuente no podrn tener el mismo nombre.

Para ms informacin, refirase a la seccin Creando objetos relocalizables.


Ejemplo
udata
Var1 res
Doble res

1
2

UDATA_ACS (Inicia seccin de acceso de datos no inicializados)


<etiqueta>

udata_acs

[<RAM address>]

Descripcin
Para ser usada cuando se genere un archivo objeto. Esta directiva declara el inicio de una
seccin de acceso de datos no inicializados. Si <etiqueta> no fuese especificada, la seccin
sera nombrada .udata_acs. La direccin inicial ser inicializada con la direccin especificada o
ser asignada en el momento del encadenamiento (link) si ninguna direccin fuese
especificada. Ningn cdigo ser generado en este segmento. La directiva RES ser usada
para reservar espaci para datos.
Nota:

Dos secciones en el mismo archivo fuente no podrn tener el mismo nombre.

Para ms informacin, refirase a la seccin Creando objetos relocalizables.


Ejemplo
udata
Var1 res
Doble res

1
2

UDATA_OVR (Inicia seccin de encimamiento datos no inicializados)


<etiqueta>

udata_ovr

[<RAM address>]

Descripcin

325

Para ser usada cuando se genere un archivo objeto. Esta directiva declara el inicio de una
seccin de encimamiento (overlayed) de datos no inicializados. Si <etiqueta> no fuese
especificada, la seccin sera nombrada .udata_ovr. El espacio declarado mediante esta
seccin es encimada por todas las otras secciones del mismo nombre. Esta es una manera
ideal de declarar variables temporales debido a que permite declarar mltiples variables en la
misma localidad de memoria. Ningn cdigo ser generado en este segmento. La directiva
RES ser usada para reservar espaci para datos.
Nota:

Dos secciones en el mismo archivo fuente no podrn tener el mismo nombre.

Para ms informacin, refirase a la seccin Creando objetos relocalizables.


Ejemplo
Temps
Temp1
Temp2
Temp3

udata_ovr
res
1
res
1
res
1

Temps
LongTemp1

udata_ovr
res
2

LongTemp2

res

; Esta variable estar en la misma localidad que


; Temp1 y Temp2
; Esta variable estar en la misma localidad que
; Temp3

UDATA_SHR (Inicia seccin compartida de datos no inicializados)


<etiqueta>

udata_shr

[<RAM address>]

Descripcin
Para ser usada cuando se genere un archivo objeto. Esta directiva declara el inicio de una
seccin compartida de datos no inicializados. Si <etiqueta> no fuese especificada, la seccin
sera nombrada .udata_shr. La direccin de inicio ser inicializada con la direccin especificada
o ser asignada en el momento de la encadenacin (link) si la direccin no es especificada.
Esta directiva es utilizada para declarar variables que son localizadas en RAM que es
compartida a travs de todos los bancos de RAM (es decir, RAM sin bancos). Ningn cdigo
ser generado en este segmento. La directiva RES ser usada para reservar espaci para
datos.
Nota:

Dos secciones en el mismo archivo fuente no podrn tener el mismo nombre.

Para ms informacin, refirase a la seccin Creando objetos relocalizables.


Ejemplo
Temps
Temp1
Temp2
Temp3

udata_shr
res
1
res
1
res
1

326

26

Encadenador MPLINK

El encadenador (linker) MPLINK es usado con el ensamblador relocalizable MPASM y el


compilador C MPLAB C17 y C18 para generar cdigo ejecutable (archivo .hex). Asimismo, el
MPLINK podr ser utilizado con la librera MPLIB de MICROCHIP.
El encadenador MPLINK fu diseado para ser usado con el programa desarrollador MPLAB
IDE. Una vez que la aplicacin ha sido construida, es conveniente utilizar el MPLAB IDE para
probar y depurar (debug) el cdigo usando el simulador o un emulador y posteriormente usar
un programador de dispositivos (microcontroladores) para finalmente programar la parte. Para
ms informacin acerca de MPLAB IDE, refirase al siguiente captulo.
El encadenador MPLINK ejecuta muchas funciones:

Localiza cdigo y datos. Toma como entrada el archivo fuente relocalizable. Decide
donde ser puesto el cdigo en la memoria de programa y donde sern puestas las
variables en la memoria RAM.
Resuelve direcciones. Las referencias externas en un archivo fuente generan
entradas relocalizables en el archivo objeto. Despus de que el encadenador (linker)
localiza el cdigo y los datos, utilizar esta informacin para actualizar las referencias
externas con las direcciones actuales.
Genera un ejecutable. Produce un archivo .hex cuyo cdigo podr ser programado en
un microcontrolador PIC o cargado en un emulador o un simulador para ser ejecutado.
Configura el tamao de la pila (stack) y la localidad. Permite al compilador MPLAB
C17 y C18 para hacer a un lado el espacio de la memoria RAM y hacer uso dinmico
de la pila (stack).
Identifica conflictos de direcciones. Verifica el programa y los datos para asegurar
que no sea otorgado el espacio que ya ha sido asignado o reservado.
Proporciona informacin de smbolos para la depuracin (debug). Genera un
archivo que MPLAB IDE utiliza para llevar la pista de las direcciones de las etiquetas,
las localidades de las variables e informacin para depuracin (debug) a nivel del
programa fuente.

Como puede ayudar el encadenador MPLINK


El encadenador (linker) MPLINK permite producir cdigo modular y reusable. El control sobre el
proceso de encadenado (link) es logrado a travs de un archivo de guin o partitura
denominado script con opciones de comandos. El encadenador asegura que todas las
referencias simblicas sean resueltas y que el cdigo y los datos generados ajusten dentro del
microcontrolador PIC.
El encadenador MPLINK puede ayudar con:

Cdigo fuente reusable. Es posible construir una aplicacin en pequeos mdulos


reusables.

327

Libreras. Se pueden hacer libreras de funciones relacionadas las cuales podrn ser
utilizadas para construir aplicaciones eficientes y fcilmente compilables.
Asignacin centralizada de memoria. Se pueden combinar objetos pre-compilados y
libreras con nuevos mdulos fuente y ponerlos eficientemente en la memoria disponible
en el momento del proceso de encadenamiento en lugar de hacerlo en el momento del
ensamble o compilacin.
Desarrollos acelerados. Debido a que las libreras y los mdulos probados no tienen que
ser recompilados cada vez que un cambio es hecho en el cdigo, el tiempo de compilacin
se reduce.

Archivos de entrada/salida del encadenador (linker)


El encadenador MPLINK combina mltiples archivos objeto dentro de un archivo .hex
ejecutable.
Archivos de entrada
Archivo objeto (.o)

Cdigo relocalizable producido de archivos fuentes.

Archivo de librera (.lib)

Una coleccin de archivos objeto agrupados juntos por


conveniencia.

Archivo de guin script

Descripcin de la disposicin de la memoria para un


procesador/proyecto en particular.

Nota:

Los archivos fuente (C o ensamblador) son utilizados cuando es construido el archivo


de listado.

Archivos de salida
Archivo COFF (.out)

Archivo intermedio utilizado por el encadenador MPLINK para


generar el archivo de cdigo, el archivo ejecutable (hex) y el
archivo de listado.

Archivo de smbolos y
depuracin (.cod)

Archivo para depurar (debug) en MPLAB.

Archivo Hex (.hex)

Archivo binario ejecutable sin informacin para depuracin.

Archivo de listado (.lst)

Cdigo fuente original junto con el cdigo binario.

Archivo de mapa (.map)

Muestra la disposicin de la memoria despus del


encadenamiento. Indica las regiones de memoria usadas y sin
usar.

Archivo objeto (.o)


El archivo objeto es el cdigo relocalizable producido desde un archivo fuente. Es trabajo del
encadenador (linker) el ensamblar archivos fuente y archivos librera, de acuerdo al archivo de
notas script para producir un archivo objeto.

328

Archivo de librera (.lib)


Un archivo de librera podr ser creado desde archivos objeto mediante MPLIB o podr ser una
librera estndar existente.
Archivo de guin o partitura script
El archivo de guin o partitura es el archivo de comandos del encadenador MPLINK, mismos
que especifican:

Memoria de programa y de datos del microcontrolador


Localizacin y tamao de la pila (stack) (para MPLAB C17/C18)
Secciones lgicas utilizadas en el archivo fuente para poner el cdigo y los datos

Las directivas de guin forman el lenguaje de comandos que controlan el funcionamiento del
encadenador. Existen cuatro categoras bsicas de directivas de guin del encadenador.
(linker).

Nota:

LIBPATH
LKEPATH
FILES
INCLUDE
Los comentarios del guin (script) del encadenador son especificados mediante //, es
decir, cualquier texto entre // y el final de la lnea ser ignorado.

A continuacin se describen estas directivas.


El manejador de proyectos del MPLAB IDE podr poner esta informacin directamente.
LIBPATH
Los archivos objeto y librera que no tengan un trayecto de bsqueda (path) sern buscados
usando la trayectoria de bsqueda de librera/objeto. Las siguientes directivas agregan
directorios adicionales de bsqueda:
LIBPATH

libpath

Donde libpath corresponde a una lista de directorios separados por el carcter :.


Ejemplo:
Para adicionar el directorio corriente y el directorio C:\PROJECTS\INCLUDE a la trayectoria de
bsqueda la siguiente lnea deber ser agregada al archivo de comandos del encadenador:
LIBPATH

C:\PROJECTS\INCLUDE

LKPATH
Los archivos de comandos del encadenador que no tengan un trayecto de bsqueda (path)
sern buscados usando la trayectoria de bsqueda de los archivos de comandos del
encadenador. Las siguientes directivas agregan directorios adicionales de bsqueda:

329

LKRPATH

lkrpath

Donde lkrpath corresponde a una lista de directorios separados por el carcter :.


Ejemplo:
Para adicionar el directorio corriente y el directorio C:\PROJECTS\SCRIPTS a la trayectoria de
bsqueda la siguiente lnea deber ser agregada al archivo de comandos del encadenador:
LIBPATH

C:\PROJECTS\SCRIPTS

FILES
La siguiente directiva especifica los archivos objeto y librera del encadenador:
FILES objfile/libfile [objfile/libfile`]
donde, objfile/libfile es un archivo objeto o de librera.
Nota:

Ms de un archivo objeto o de librera podr ser especificado en una sola directiva


FILE.

Ejemplo:
Para especificar que el mdulo objeto MAIN.O sea encadenado con el archivo de librera
MATH.LIB, la siguiente lnea debera ser agregada al archivo de comandos del encadenador.
FILES

main.o math.lib

INCLUDE
La siguiente librera incluye un archivo de comandos adicional.
INCLUDE cmdfile
donde, cmdfile es el nombre del archivo de comandos del encadenador a incluir.
Ejemplo:
Para incluir el archivo de comandos del encadenador llamado MYLINK.LKR, la siguiente lnea
deber ser agregada al archivo de comandos del encadenador.
INCLUDE mylink.lkr
Archivo COFF (.out)
El encadenador MPLINK generar un archivo COFF el cual servir como un archivo intermedio.
El programa MP2COD.EXE generar los archivos COD mientras que el programa
MP2HEX.EXE generar los archivos HEX.

330

Archivo de smbolos y depuracin (.cod)


El encadenador MPLINK producir un archivo COD para ser utilizado por el MPLAB IDE como
cdigo para depuracin (debug). El nombre del archivo COD, incluyendo la ruta (path) tendr
un lmite de 63 caracteres.
Archivo Hex (.hex)
Esta herramienta es capz de producir diferentes formatos del archivo HEX.

Formato Hex Intel (INHX8M) Para programadores estndar.


Formato dividido Hex Intel (INHX8S) Para programadores de ROM par/impar.
Formato Hex 32 Intel (INHX32) Para programadores de 16 bits.

Archivo de listado (.lst)


El archivo del listado absoluto generado por el encadenador MPLINK provee un mapa del
cdigo fuente con las instrucciones de mquina.
Archivo de mapa (.map)
El archivo de mapa generado por el encadenador MPLINK provee informacin sobre la
localizacin absoluta de los smbolos del cdigo fuente en la salida final. Asimismo, provee
informacin sobre el uso de la memoria, indicando la memoria usada y sin usar.
El archivo de mapa contiene tres tablas. La primera tabla (seccin info) despliega informacin
acerca de cada seccin. La informacin incluye el nombre de la seccin, su tipo, direccin de
inicio, si la seccin reside en memoria de programa o de datos y su tamao en bytes.
Existen cuatro tipos de secciones:

Cdigo (code)
Datos inicializados (idata)
Datos no inicializados (udata)
Datos de ROM inicializados (romdata)

Procesamiento del encadenador (linker)


Un encadenador combina mltiples mdulos objeto de entrada en un solo mdulo de salida
ejecutable. Los mdulos objeto de entrada podrn contener secciones de cdigo absoluto o
relocalizable o datos que sern asignados en una memoria especfica. La arquitectura de la
memoria especfica ser descrita en el archivo de comandos del encadenador, el cual
proporciona un mecanismo flexible para especificar bloques de memoria y sus mapas de
secciones. Si el encadenador no lograra encontrar el bloque de memoria especfica en el cual
asignar una seccin, un error sera generado. El encadenador combinar las entradas como
fueron nombradas en una seccin de salida. El algoritmo de asignacin ser descrito a
continuacin:
Una vez que el encadenador ha asignado todas las secciones de todos los mdulos de entrada
en la memoria especfica, comenzar el proceso de relocalizacin de smbolos. Los smbolos
definidos en cada seccin de entrada tendrn direcciones dependientes del inicio de sus
secciones.

331

Despus de que el encadenador ha relocalizado los smbolos definidos en cada seccin de


entrada, resolver los smbolos externos. El encadenador intentar comparar todas las
referencias de smbolos externos con la correspondiente definicin del smbolo. Si cualquier
referencia de smbolo externo no tuviese una definicin de smbolo correspondiente, un intento
de localizar la definicin del smbolo correspondiente en el archivo de librera sera hecho. Si la
correspondiente definicin del smbolo no fuese encontrada, un error ser generado.
Si la resolucin de smbolos externos fuese exitosa, entonces el encadenador procedera a
ajustar cada seccin de datos. Cada seccin contendr una lista de entradas relocalizadas las
cuales asociarn localidades en la seccin de datos con los smbolos relocalizables. Las
direcciones de los smbolos relocalizables seran ajustados.
Despus de que el encadenador haya procesado todas las entradas relocalizables, entonces
generar un mdulo de salida ejecutable.
Algoritmo de asignacin del encadenador
El encadenador asignar las secciones para permitir mximo control sobre la localizacin del
cdigo y los datos, denominados secciones en la memoria especfica. Existen cuatro clases
de asignaciones que el encadenador maneja. La seccin podr ser absoluta o relocalizable (no
absoluta), y podr ser asignada a bloques de memoria especfica en el archivo de comandos
del encadenador o podr ser dejada sin asignar. De esta manera, existen cuatro tipos de
localizacin:
1.
2.
3.
4.

Absoluta asignada
Absoluta sin asignar
Relocalizable asignada
Relocalizable no asignada

El encadenador ejecutar secciones absolutas asignadas primero, seguido por secciones


relocalizables asignadas y finalmente secciones relocalizables sin asignar.
Absoluta asignada
Las secciones absolutas podrn ser asignadas a bloques de memoria especfica en el archivo
de comandos del encadenador, pero debido a que las direcciones de las secciones son fijas, el
encadenador solo podr verificar que dicho bloque de memoria tenga suficiente espacio y que
esta seccin no se traslape con otras secciones. Si no fuesen asignados un bloque de memoria
especfica a la seccin absoluta, el encadenador tratara de encontrarle uno. Si ste no fuese
encontrado, un error sera generado. Debido a que las secciones absolutas nicamente pueden
ser asignadas a una direccin fija, las secciones asignadas y no asignadas sern ejecutadas
sin un orden en particular.
Relocalizable asignada
Una vez que todas las secciones absolutas han sido asignadas, el encadenador localizar las
secciones relocalizables asignadas. El encadenador asignar bloques de memoria especfica
para verificar que exista espacio disponible, ya que de no haber dicho espacio, un error ser
generado. La localizacin de las secciones relocalizables asignadas ocurrirn en el orden en
que fueron especificadas en el archivo de comandos del encadenador.

332

Relocalizable no asignada
Una vez que han sido asignadas todas las secciones relocalizables asignadas, el encadenador
procede a localizar las secciones relocalizables no asignadas, empezando con la seccin ms
grande y finalizando con la ms pequea. Para cada localizacin se elige el bloque de memoria
especfica con el espacio disponible ms pequeo que pueda acomodar la seccin. De esta
manera, iniciando con la seccin ms grande y eligiendo el espacio ms pequeo para
acomodarla, el encadenador incrementa la posibilidad de localizar todas las secciones
relocalizables no asignadas.
La pila (stack) no es una seccin pero tambin es asignada. El archivo de comandos del
encadenador podr o no asignar la pila (stack) a un bloque de memoria especfico. As, si la
pila (stack) es asignada a un bloque de memoria especfico, se localizar justo antes de las
secciones relocalizables asignadas. Si la pila (stack) no es asignada, sta se localizar
despus de las secciones relocalizables asignadas pero antes de las secciones relocalizables
no asignadas.
Datos inicializados
El encadenador MPLINK realiza un proceso especial para las secciones de entrada con datos
inicializados, las cuales contienen valores iniciales (inicializadores) para las variables y
constantes definidas dentro de stas. Debido a que las variables y constantes residen en la
memoria RAM, estos datos debern ser almacenados en la memoria de programa (ROM) no
voltil. Para cada seccin de datos inicializados, el encadenador crea una seccin en la
memoria de programa. Estos datos son movidos a sus localidades en la memoria RAM
mediante un cdigo de inicializacin (proporcionado por el ensamblador MPASM o por el
compilador C17/C18 de MPLAB), en el arranque del programa.
Los nombres de las secciones de inicializacin creadas por el encadenador sern los mismos
que los de las secciones de datos inicializados pero con los smbolos _i agregados. Por
ejemplo, si el mdulo objeto de entrada contiene una seccin de datos inicializados llamada
.idata_main.o, el encadenador crear una seccin en la memoria de programa con el nombre
.idata_main.o_i, la cual contendr los datos.
Adicionalmente a la creacin de las secciones inicializadas, el encadenador crear una seccin
llamada cint en la memoria de programa, la cual contendr una tabla con entradas para cada
seccin de datos inicializados. Cada entrada es triple ya que especifica donde comenzar la
seccin inicializadora en la memoria de programa, donde se ubicar el inicio de la seccin de
datos inicializados en la memoria RAM y cuantos bytes hay en dicha seccin. El cdigo de
inicializacin acceder esta tabla y copiar los datos de ROM a RAM.
Para informacin ms detallada y ejemplos acerca del encadenador MPLINK, refirase a la
seccin de ayuda en la barra de men del programa de desarrollo MPLAB, ya que el alcance
de este libro no pretende ensear a fondo este tpico.

333

334

27

MPLAB IDE

MPLAB IDE es un programa desarrollado en Windows por MICROCHIP TECHNOLOGY INC.


que crea un ambiente de desarrollo integrado (Integrated Development Environment) (IDE)
para las familias de microcontroladores PIC, y el cual permite escribir, depurar y optimizar
programas (firmware) de aplicaciones con microcontroladores. MPLAB incluye un editor de
texto, un simulador y un manejador de proyectos. Tambin soporta los emuladores MPLAB-ICE
y PICMASTER, los programadores PICSTART Plus y PRO MATE II, as como otras
herramientas de desarrollo de sistemas producidas por MICROCHIP y otras empresas.
Las herramientas de MPLAB permite:

Editar, ensamblar, compilar y encadenar (link) cdigo fuente.


Depurar (debug) la lgica ejecutable mediante la observacin del flujo del programa
con el simulador, o en tiempo real con el emulador MPLAB-ICE.
Realizar mediciones de tiempos.
Observar valores de variables a travs de ventanas de observacin (Watch Windows).
Programar el cdigo de aplicacin (firmware) en los microcontroladores PIC mediante
los programadores PICSTART Plus y PRO MATE II.
Buscar respuestas rpidas a preguntas referentes al MPLAB a travs de su seccin de
ayuda (help) en lnea.
Y mucho ms.

MPLAB Un ambiente de desarrollo integrado (IDE)


MPLAB es un ambiente de desarrollo integrado (IDE) fcil de aprender y usar. El IDE
proporciona a los ingenieros la flexibilidad de desarrollar y depurar programas de aplicacin
para las familias de microcontroladores PIC de MICROCHIP, y corre bajo el sistema operativo
WINDOWS (3.1x, 95, 98, NT, 2000 y XP) de MICROSOFT. Sin embargo, no todos los
componentes de hardware que funcionan con MPLAB IDE (tales como programadores y
emuladores) funcionarn bajo todos los sistemas operativos. Para detalles, refirase a sus
respectivos manuales de usuario.
MPLAB proporciona funciones que permitirn:

Crear y editar archivos fuentes


Agrupar archivos dentro de proyectos
Depurar (debug) el cdigo fuente
Depurar la lgica ejecutable utilizando el simulador o un emulador.

En efecto, MPLAB IDE permite crear y editar cdigo fuente mediante un completo editor de
texto.

335

Tambin se podr fcilmente depurar el cdigo fuente con la ayuda del listado del resultado (a
travs de una ventanas de despliegue), los errores de ensamble, compilacin o
encadenamiento encontrados cuando se generen los archivos ejecutables.
El manejador de proyectos (Project Manager) permite agrupar los archivos fuente, los
archivos objeto precompilados, las libreras y los archivos guin (script) del encadenador
(linker) dentro de un formato de proyecto.
El MPLAB IDE proporciona tambin el ambiente para usar un simulador rico en caractersticas
o un emulador, para depurar (debug) la lgica de los ejecutables. Algunas de estas
caractersticas son:

Una variedad de ventanas que permiten ver el contenido de todas las localidades de la
memoria de programa y de datos
Ventanas que permiten ver el cdigo fuente y su reporte de ensamble.
La habilidad de ejecutar el programa paso a paso, aplicar puntos de paro (Break),
seguir la huella (Trace) y programar puntos de disparo (Trigger points) estndar o
complejos.

Herramientas de desarrollo de MPLAB


MPLAB IDE integra varias herramientas para proporcionar un completo ambiente de desarrollo.

El manejador de proyectos (Project Manager) MPLAB


Es utilizado para crear un proyecto y trabajar con los archivos especficos relacionados
al proyecto. Cuando se usa un proyecto, el cdigo fuente es reconstruido y cargado en
el simulador o emulador con un simple click del ratn (mouse).

El editor MPLAB
Crea y edita archivos de texto tales como archivos fuente, cdigo y archivos de guin
(script) del encadenador.

El simulador MPLAB-SIM
El programa simulador modela la ejecucin de las instrucciones y las entradas/salidas
(I/O) del microcontrolador PIC.

El depurador (debugger) MPLAB-ICD


Es un programador para la familia de microcontroladores PIC16F87x as como un
depurador (debugger) in-circuit.

El ensamblador universal MPASM, el encadenador relocalizable MPLINK y la librera


MPLIB
El ensamblador MPASM permite que el cdigo fuente sea ensamblado sin salir de
MPLAB. MPLINK crea una aplicacin final a partir del encadenamiento de mdulos
relocalizables.

El compilador C MPLAC-C17/C18

336

Proporciona soluciones de cdigo fuente de alto nivel basado en ANSI para los
microcontroladores PIC17Cxxx y PIC18Cxxx respectivamente. Los proyectos
complejos podran usar una combinacin de archivos fuente en C y en ensamblador
para obtener un mximo de beneficios de velocidad y mantenimiento.

Los programadores PRO MATE II y PICSTART Plus


Sirven para programar los microcontroladores a partir del archivo de salida ejecutable
(hex). Aunque el programador PRO MATE II no requiere de MPLAB para operar, la
programacin ser mucho ms fcil usndolo.

Los emuladores PICMASTER MPLAB-ICE


El emulador PICMASTER utiliza hardware para emular los microcontroladores PIC en
tiempo real, con o sin un sistema de aplicacin (target system). El emulador MPLABICE es el ms moderno emulador de MICROCHIP.

Editar la informacin del proyecto


Utilice el dilogo del editor de proyectos para determinar las opciones de un proyecto
especfico.
Abrir un proyecto existente
1. En el men Project > Open Project, seleccione el directorio en el cual se encuentra el
proyecto con el que desee trabajar.
2. Localice el nombre del nuevo proyecto y seleccinelo (haga click en l).
3. Seleccione (haga click en) OK para abrir el proyecto.
Introduciendo el archivo especfico (target file)
Introduzca el nombre del cdigo ejecutable final de salida. Por default, el archivo especfico
tomar el mismo nombre que el del proyecto, con la extensin .hex. Es posible cambiar el
nombre del archivo especfico si se esta usando un encadenador (linker). Si el proyecto es
escrito utilizando cdigo absoluto (no encadenado), el MPLAB forzar que el archivo especfico
coincida con el nombre del archivo fuente. En general, esto ser menos confuso si el archivo
especfico y el proyecto tengan el mismo nombre.
Indicando la trayectoria (path) de los archivos include, library y linker script
La indicacin de la trayectoria de los archivos de inclusin (include), de librera (library), y de
guin del encadenador (linker script), son usadas por el MPLAB en dos formas:

Cuando se construye un proyecto, estos son pasados a la herramienta para que acepte
la trayectoria como una entrada de comando de lnea. Es decir, la trayectoria de los
archivos include es pasado al ensamblador o al compilador. La trayectoria de los
archivos library y de los archivos linker script es pasado al encadenador (linker).
Estos son utilizados para localizar los archivos del proyecto para determinar cual de
stos ha cambiado una vez que se ha ejecutado la tarea de Hacer proyecto (Make
Project).

337

Si la trayectoria de los archivos include no es proporcionado, la tarea de Hacer proyecto


(Make Project) no ser capz de encontrarlo y proceder a construir el proyecto entero. La
construccin ser exitosa debido a que el ensamblador o el compilador buscarn los archivos
va la variable MCC_INCLUDE en el archivo AUTOEXEC:BAT. Sin embargo, esta es una
manera ineficiente de construir un proyecto.
Poniendo la trayectoria de include
Introduzca la trayectoria al directorio conteniendo cualquier archivo incluido (include) en el
proyecto, es decir, los archivos Header en la caja Include Path del dilogo del Edit Project.
Poniendo la trayectoria de library
En la caja Library del dilogo del Edit Project, introduzca la trayectoria al directorio que
contenga los archivos de librera del proyecto. Esta trayectoria nicamente podr ser puesta si
se ha seleccionado para el proyecto como la herramienta del lenguaje al encadenador (linker).
Poniendo la trayectoria del archivo linker script
En la caja Linker script del dilogo del Edit Project, introduzca la trayectoria al directorio que
contenga los archivos de guin del encadenador del proyecto. Esta trayectoria nicamente
podr ser puesta si se ha seleccionado para el proyecto como la herramienta del lenguaje al
encadenador (linker).
Cada caja de trayectoria podr contener uno o ms trayectorias relativas o absolutas
separadas por el carcter ;. Por ejemplo:
c: \mplab\proyects\mpproj\include;c:\include\h;.. \sys
Seleccionando el modo de desarrollo
1. Si se desea cambiar la configuracin del modo de desarrollo, seleccione (haga click
en) Change... a la derecha de las opciones del modo de desarrollo en el dilogo del
Edit Project para desplegar el dilogo del modo de desarrollo.
2. Seleccione el modo de desarrollo haciendo click en el modo deseado.
3. Entonces seleccione las opciones para ese modo.
4. Haga click en Reset para poner este modo o haga click en Cancel para salir del
dilogo del modo de desarrollo sin cambiar el modo.
Seleccin de la herramienta del lenguaje (Language Tool)
Es posible seleccionar la herramienta del lenguaje desde la lista del submen en la parte
superior del dilogo de propiedades del nodo. Posiblemente se necesite instalar la herramienta
del lenguaje deseado, ya que se pudiera seleccionar una opcin que se encuentre instalada en
la PC pero el proyecto no se pueda construir.

338

Si se instala la herramienta del lenguaje (es decir, ensamblador, compilador, etc.) antes de
instalar MPLAB se deber salir del dilogo Project > Edit e ir al dilogo Project > Install
Language Tool para darle informacin a MPLAB acerca de la herramienta del lenguaje en el
correspondiente dilogo. Entonces siga los siguientes pasos:
1. Seleccione Project > Install Language Tool desde el men para desplegar el dilogo
de la instalacin de la herramienta del lenguaje.
2. Seleccione el lenguaje.
3. Seleccione el nombre de la herramienta.
4. Especifique el ejecutable as como su trayectoria (path). Haga click en Browse para
buscar la herramienta ejecutable.
5. Seleccione la ventana de la opcin deseada.
6. Haga click en OK.
7. Para regresar al dilogo de edicin de proyectos, seleccione Project > Edit Project.
Nota:

Las herramientas del lenguaje de MICROCHIP son: MPASM, MPLINK, MPLAB-C17 y


MPLAB-C18.

Agregando un nodo a un proyecto


Haga click en el botn Add Node para adicionar archivos fuente, libreras, y guiones del
encadenador a la lista de los archivos del proyecto.
Si la herramienta del lenguaje seleccionada por el nodo especfico permite encadenar mltiples
archivos, el botn Add Node estar siempre disponible. De lo contrario, el botn Add Node
estar disponible hasta que sea seleccionado el nodo del archivo fuente.
Para un proyecto de un solo archivo (absoluto), si se selecciona un nodo de archivo fuente que
tenga un nombre diferente al nombre del archivo especfico, ste ltimo archivo y el nodo
principal (main node) sern cambiados de nombre para coincidir con el nombre del archivo
fuente.
Creando un nuevo nodo basado en uno ya existente
El botn Copy Node permite crear un nuevo nodo con todas las propiedades del nodo
existente (excepto el nombre del archivo). Este botn ser disponible si la herramienta del
lenguaje seleccionada para el nodo principal (main node) permite mltiples archivos a ser
encadenados (linked) y otro nodo diferente al nodo principal es seleccionado.
Para crear un nuevo nodo, seleccione el nodo cuyas propiedades se desea tener y haga click
en el botn Copy Node. En el dilogo de agregar un nodo (Add Node) introduzca el nombre del
nuevo nodo y haga click en OK. El nuevo nodo aparecer en la lista de los archivos del
proyecto. Si desea cambiar cualquiera de sus propiedades, seleccinelo y haga click en el
botn Node Properties.

339

Borrando un nodo
Para borrar un nodo (excepto el nodo principal), seleccione el nodo que se desee borrar y haga
click en el botn Delete Node.
Construyendo un nodo
Haga click en el botn Build Node para ensamblar, compilar o encadenar un nodo individual
sin construir el proyecto entero. Este botn estar disponible siempre y cuando:

La herramienta del lenguaje seleccionada para el nodo principal (main node) permite a
mltiples archivos ser encadenados y se ha seleccionado un nodo que podr ser
ensamblado, compilado o encadenado.
La herramienta del lenguaje permite nicamente un archivo fuente y el nodo principal
ha sido seleccionado.

Para construir un nodo, seleccione el nodo y entonces haga click en el botn Build Node.
Seleccionando las propiedades de un nodo
El botn Node Properties permite seleccionar y ver las propiedades (excepto el nombre del
archivo) del nodo seleccionado. Se debern seleccionar las propiedades del nodo principal
cuando sea creado un nuevo proyecto.
Si la herramienta del lenguaje seleccionado para el nodo principal soporta solo un archivo, el
botn Node Properties estar disponible nicamente para ese nodo. Si la herramienta del
lenguaje seleccionado para el nodo principal soporta mltiples archivos, el botn Node
Properties estar disponible para cada nodo que pueda ser construido.
Para seleccionar el tipo de proyecto a utilizar (absoluto o relocalizable):
1. Seleccione el nodo en la lista de archivos del proyecto y haga click en el botn Node
Properties.
2. Seleccione la herramienta del lenguaje desde la lista del submen en la parte superior
del dilogo de propiedades del nodo. Para un proyecto relocalizable (encadenado),
seleccione al encadenador (linker) como la herramienta del lenguaje, a partir de la lista
del submen de herramientas del lenguaje en la parte superior del dilogo de
propiedades del nodo.
3. Haga click en OK para regresar al dilogo de edicin de proyecto.
Creando y construyendo un proyecto en MPLAB
Para crear un proyecto, siga los siguientes pasos:
Para configurar el proyecto:
1. Seleccione la herramienta del lenguaje.
2. Seleccione el modo de desarrollo.
3. Iniciar un nuevo proyecto.

340

Para editar un proyecto


4.
5.
6.
7.

Elegir la trayectoria (path) include.


Elegir las propiedades del nodo especfico (target node).
Elegir la trayectoria (path) library.
Elegir la trayectoria (path) linker script.

Para agregar archivos al proyecto


8.
9.
10.
11.
12.
13.

Agregar l o los archivos fuente.


Elegir las propiedades del nodo para l o los archivos fuente.
Agregar los archivos objeto (object files).
Agregar los archivos de librera (library files).
Agregar los archivos guin del encadenador (linker script files).
Salvar el proyecto

Para construir el proyecto


14. Construir el proyecto.
15. Arreglar los desperfectos del proceso de construccin.
Iniciando un nuevo proyecto
1. Para iniciar un nuevo proyecto, en Project > New Project, seleccione el directorio en
donde ser puesto el nuevo proyecto.
2. Introduzca un nombre para el archivo del nuevo proyecto.
3. Haga click en OK para continuar.
Seleccionando las propiedades del nodo especfico (target node)
1. Haga click sobre el archivo HEX (.hex) en la seccin de los archivos del proyecto en
el dilogo de edicin de proyectos para sobresaltar el nombre del archivo .hex y activar
el botn Node Properties.
2. Haga click en el botn Node Properties.
3. En el dilogo de propiedades del nodo, seleccione la herramienta del lenguaje del
proyecto:
Para un proyecto de un solo archivo (absoluto), seleccione el ensamblador o
compilador que se usar (ejemplo, MPASM).
Nota:

No todas las herramientas del lenguaje (incluyendo MPLAB-CXX) soportan


este tipo de proyectos.

Para un proyecto de archivos mltiples (relocalizable o encadenado), seleccione un


encadenador (linker) (ejemplo, MPLINK).
4. El dilogo de propiedades del nodo mostrar los interruptores de la lnea de comando
para la herramienta seleccionada. Las cajas marcadas representan los valores
predeterminados (default) para esa herramienta.
5. Haga click en OK para aplicar los valores al nodo especfico (target node).

341

Agregando archivos fuente a un proyecto


1. Haga click en Add Node para desplegar el dilogo de adicin de nodos.
2. En este dilogo, encuentre el archivo fuente y haga click sobre l. Asegurese de que
la lista del tipo de archivos especifique archivos fuente (Source Files). Para agregar
ms de un archivo, sujete oprimida la tecla de control (CTRL) cuando seleccione con el
ratn ms archivos.
El directorio desde el cual se elijan los archivos ser por default el directorio del proyecto.
Para seleccionar archivos desde un directorio diferente, seleccione la unidad de disco y la
trayectoria de stos desde el dilogo de adicin de nodos. Seleccione el archivo deseado.
3. Haga click en OK.
Agregando archivos objeto a un proyecto
Haga click en el botn Add Node desde el dilogo de edicin de proyecto para agregar
cualquier archivo objeto necesario para el proyecto. Asegurese de que la lista del tipo de
archivos especifique Object Files.
Para seleccionar ms de un archivo a la vez, mantenga presionada la tecla CTRL en el teclado
mientras sean seleccionados los archivos con el ratn. Haga click en OK.
Nota:

Las propiedades del nodo no podrn ser cambiadas en los archivos objeto, una vez
que stos han sido ensamblados o compilados.

Agregando archivos de librera a un proyecto


Una librera es una coleccin de funciones agrupadas por referencia y fciles de encadenar.
Una librera podr ser proveda con una herramienta denominada MPLIB.
Haga click en el botn Add Node desde el dilogo de edicin de proyecto para agregar
cualquier archivo de librera necesario para el proyecto. Asegurese de que la lista del tipo de
archivos especifique Library Files.
Para seleccionar ms de un archivo a la vez, mantenga presionada la tecla CTRL en el teclado
mientras sean seleccionados los archivos con el ratn. Haga click en OK.
Nota:

Las propiedades del nodo no podrn ser cambiadas en los archivos de librera, una vez
que stos han sido ensamblados o compilados.

Agregando un archivo de guin del encadenador (linker script)


Si se ha elegido MPLINK como herramienta del lenguaje del proyecto, haga click en el botn
Add Node desde el dilogo de edicin de proyecto para agregar un archivo de guin del
encadenador (linker script) para el proyecto. Asegurese de que la lista del tipo de archivos
especifique Linker Scripts.
Haga click en OK.
Nota:

Las propiedades del nodo no podrn ser seleccionadas sobre un


archivo de guin del encadenador.

342

Salvando un nuevo proyecto


Presione OK sobre el dilogo de edicin de proyecto para terminar de editarlo. Si fuese
presionado CANCEL en lugar de OK, el nuevo proyecto no ser salvado.
Construyendo (building) o generando (making) un proyecto
Para reensamblar o recompilar aquellos archivos que han cambiado o aquellos que tienen
dependencias (como archivos include) con los que han cambiado, seleccione Project > Make
Project desde el men para ensamblar o compilar el proyecto.
Para reensamblar o recompilar todos los archivos del proyecto, independientemente si han
cambiado o no, seleccione Project > Build All desde el men para ensamblar o compilar el
proyecto.
La ventana de resultados de la construccin desplegar las lneas de comando enviadas a
cada herramienta as como el resultado de las mismas (es decir, construccin exitosa o fallida).
Esta informacin es til para encontrar errores en la construccin o generacin del proyecto.
Corriendo (running) y depurando (debugging) un proyecto en MPLAB
Para correr y depurar un proyecto en MPLAB, siga los siguientes pasos:
1. Corra continuo (Run) o corra paso a paso (single-step) de principio a fin el proyecto.
2. Depure (debug) el proyecto utilizando ventanas de observacin (Watch Windows),
puntos de ruptura (breakpoints) y puntos de trazo (trace points).
Corriendo (running) un proyecto en MPLAB

Para inicializar el sistema, seleccione Debug > Run > Reset.


El contador de programa ser inicializado a cero. La lnea del cdigo fuente en esta
direccin ser remarcada con una barra obscura. (Se podr observar que el contador
de programa PC ser puesto a 0x00 en la barra de estado (status) en la parte inferior
(bottom) del MPLAB.

Para correr el programa una instruccin a la vez, seleccione Debug > Run > Step o
presione <F7>.
Esto causar que el contador de programa PC avance a la localidad de la prxima
instruccin. La barra obscura seguir al cdigo fuente y el contador de programa,
desplegado en la barra de estado, avanzar.

Para correr todo el programa de una sola vez, seleccione Debug > Run > Run o
presione <F9>.
El programa comenzar corriendo desde la localidad que apunte el contador de
programa. La barra de estado cambiar de color indicando que el programa esta
ejecutando instrucciones. Ninguno de los otros campos sobre la barra de estado sern
actualizados hasta que el programa sea detenido (halted).

Para detener el programa, seleccione Debug > Run > Halt o presione <F5>.

343

La barra de estado cambiar a su color original y el contador de programa PC y otra


informacin del estado (status) ser actualizada.
Depurando un proyecto en MPLAB
Existen varias manera de mirar al programa y su ejecucin utilizando MPLAB:

Inspeccionando la ventana de registros de fila.


Utilizando una ventana de observacin (Watch Window).
Seleccionando un punto de rompimiento (breakpoint).

Inspeccionando la ventana de registros de fila


1. Seleccione Windows > File Registers.
Una pequea ventana con todos los registros de fila o RAM del microcontrolador
seleccionado, aparecer
2. Presione <F7> (ejecutar paso a paso) unas cuantas veces y observe la actualizacin
de los valores en la ventada de registros de fila.
Cada vez que un registro sea incrementado, esto es reflejado en la ventana de
registros de fila. Los registros de fila que cambian su valor, cambiarn su color, de
manera tal que stos sean fciles de observar. Sin embargo, en programas muy
complejos, muchos valores podran cambiar, haciendo difcil el enfoque en una o dos
variables. Este problema puede ser resuelto utilizando una ventana de observacin
(Watch Window).
Utilizando una ventana de observacin (Watch Window)
MPLAB permite que el contenido de los registros de fila pueda ser monitoreados a travs de
ventanas de observacin (Watch Window). Para crear una ventana de observacin, seleccione
Window > Watch Window > New Watch Window.
Si ya ha sido creada una ventana de observacin, y sta ha sido salvada en disco, seleccione
Window > Watch Window > Load Watch Window. Seleccione el archivo de la ventana de
observacin a cargar y haga click en OK, o doble click en el archivo deseado.
Tanto el dilogo para agregar smbolos a observar como la ventana de observacin sern
abiertas. Se podrn agregar o borrar smbolos as como sus propiedades de despliegue. Haga
click en Close cuando se haya terminado de agregar smbolos.
Nota:

Si la opcin de congelacin de perifricos al detener (Freeze Peripheral On Halt) es


seleccionada en la pestaa de opciones de rompimiento (Break Options) bajo Options
> Development Mode, los bits del puerto de entrada/salida (I/O) en los registros de
funcin especial o en las ventanas de observacin no sern actualizados cuando se
encuentre en el modo de paso a paso.

Para desplegar el contenido de la ventana de observacin con o sin nmeros de lnea,


seleccione Toggle Line Numbers desde el men del sistema.
Utilice el submen de Window > Watch Window o el men del sistema dentro de la ventana de
observacin para editar la informacin contenida en sta ventana.

344

Agregar un smbolo a la
ventana de observacin

Seleccione Window > Watch Window > Add


to Active Watch desde le men de MPLAB o
seleccione Add Watch desde el men del sistema
dentro de la ventana de observacin.

Borrar un smbolo desde la


ventana de observacin

Haga click sobre el smbolo en la ventana de


observacin y entonces seleccione Delete Watch
desde el men del sistema.

Cambiar el formato de
despliegue de los smbolos

Seleccione Window > Watch Window > Edit


Active Watch desde le men de MPLAB o seleccione
Edit Watch desde el men del sistema dentro de la
ventana de observacin. Entonces haga click en
Properties. El dilogo de propiedades permitir
seleccionar el formato (format), tamao (size), el orden
de los bytes (byte order), y los bits de despliegue para
ser desplegados en la ventana de observacin.

Salvar la ventana de
observacin

Seleccione Window> Watch Window > Save


Active Watch desde le men de MPLAB o seleccione
Save Watch desde el men del sistema dentro de la
ventana de observacin.

Seleccionando un punto de rompimiento (breakpoint)


1. Si el programa esta corriendo, seleccione Debug > Run > Halt desde el men o
presione <F5> para detener el programa.
2. Haga click en la ventana del cdigo fuente sobre la lnea siguiente a la cual se desea
poner el rompimiento (break). Haga click con el botn derecho del ratn para
desplegar un submen.
3. Sobre el submen, seleccione Break Point(s). La lnea donde el cursor fu localizado
cambiar de color, indicando que un punto de rompimiento (breakpoint) ha sido puesto
en esa localidad.
4. Dependiendo en donde (en el cdigo) se haya detenido y donde se haya puesto el
punto de rompimiento, se necesitar arrancar (reset) el sistema para llegar a este punto
de rompimiento.. Para arrancar (reset) el sistema, seleccione Debug > Run > Reset
desde el men o presione <F6>.
5. Seleccione Debug > Run > Run o presione <F9> para correr el sistema. El programa
correr y entonces se parar (halt) en la instruccin justo despus del punto de
rompimiento.
Editor del sistema MPLAB
El editor MPLAB es una parte del ambiente de desarrollo integrado (Integrated Development
Environment) (IDE). El editor siempre estar disponible mientras se este corriendo el MPLAB.
Este no es un archivo ejecutable separado sino que es un sistema de edicin con una serie de
caractersticas, tales como:

345

Tamao del archivo (File Size)


El editor MPLAB es limitado solamente por el monto de memoria disponible en el sistema. No
existe ningn lmite sobre el nmero de archivos editables o sobre el nmero de ventanas de
edicin abiertas. Asimismo, no tiene lmite sobre el tamao del archivo a abrir y no tiene lmite
sobre el nmero de lneas que un archivo pueda contener.
Reconfiguracin del teclado
Es posible reconfigurar las teclas para lograr los requerimientos especficos. Los comandos
podrn ser invocados mediante la secuencia de dos caracteres como Esc G y Ctrl+K Ctrl+B.
Tambin es posible usar secuencias de teclas tales como Alt+F y Alt+S. Es posible mapear
casi todas las teclas del teclado, en cualquier combinacin.
Funciones de edicin del editor MPLAB
El editor MPLAB proporciona funciones que permiten ejecutar las siguientes operaciones:
Comandos de archivo (File Commands)

New

Crea un nuevo archivo


Seleccione el comando File > New para abrir una nueva
ventana de edicin vaca en la cual se podr escribir texto. Inicialmente
la ventana no tendr un nombre de archivo. Para salvar el contenido
de dicha ventana seleccione File> Save As.
Cuando MPLAB cree la ventana de edicin, se aplicarn el conjunto de
modos que son definidos para los nuevos archivos. Para seleccionar
los paros de la tecla TAB (Tab Stops) y otras configuraciones,
seleccione Options >.

Open

Abre un archivo
Para editar uno o ms archivos existentes, seleccione File> Open.
Esto abre un dilogo estndar para seleccionar los archivos a editar. Si
un archivo seleccionado se encuentra ya abierto, MPLAB activar la
ventana que contiene ese archivo.
1. Utilice las cajas de listado de la unidad y el directorio para
seleccionar la unidad de disco y el directorio.
2. Seleccione los archivos que desee abrir en la caja de listado de
nombres de archivos.
3. Si se deseara abrir los archivos en el modo de solo lectura,
seleccione la caja Read Only. Esto afectar a todos los archivos
que se abran en esta operacin.
4. Haga click en la caja OK para abrir los archivos.
La lista del tipo de archivos listados abajo a la izquierda permite
restringir los archivos mostrados en la lista que coincidan con el patrn
especfico del nombre del archivo. Por ejemplo, *.asm listar todos los
archivos con el sufijo .asm.

View

Despliega un archivo

346

Para abrir uno o ms archivos existentes en el modo de solo lectura,


seleccione File > View. Se podrn examinar los archivos pero no se
podrn alterar. Esta accin es exactamente igual al del comando File >
Open y la caja Read Only sea seleccionada.

Save

Salva un archivo
Para salvar uno o ms archivos en disco, se tendrn tres opciones:
Seleccione File > Save para guardar o salvar el contenido de la
ventana corriente a disco. El editor de MPLAB remplazar el archivo
con el contenido de la ventana. Si el archivo no ha sido nombrado,
MPLAB preguntar por el nuevo nombre de archivo. Si un archivo del
mismo nombre existe, el editor MPLAB har la copia de respaldo y
salvar el archivo corriente.
Seleccione File > Save As para guardar el contenido del
archivo a disco, permitiendo que sea especificado el nombre del
archivo. El editor de MPLAB confirmar la sobre escritura de archivos
ya existentes:
1. Seleccione la unidad de disco y el directorio donde desee
salvar el archivo desde la caja de la lista de unidades de disco
y directorios.
2. Introduzca el nombre del archivo o seleccione el nombre de un
archivo si se desea sobre-escribirlo.
3. Haga click en OK para salvar los datos en el archivo.
4. La lista del tipo de listado de archivos en la parte inferior
izquierda permite restringir los archivos mostrados en la lista.
Seleccionando File > Save All salvar en disco el contenido de
todos los archivos alterados as como todas las plantillas (templates)
en archivos especiales.
Nota: Haciendo click en Cancel en cualquiera de los dilogos que
ocurran en este proceso, se cancelar la operacin de salvar.

Close

Cerrar un archivo
Para cerrar el archivo siendo mostrado en la ventana corriente,
seleccione File > Close. Si ha habido algn cambio en el archivo y no
se han salvado los cambios a disco, el editor MPLAB preguntar si se
desean salvar dichos cambios.
Seleccione File > Close All para cerrar todos los archivos abiertos con
los que se este trabajando. De igual manera, si ha habido algn cambio
en cualquier archivo y no se han salvado los cambios a disco, el editor
MPLAB preguntar si se desean salvar dichos cambios.

Import

Importa
Seleccione File > Import para mover datos desde un archivo de PC a
la memoria del simulador o emulador. Adicionalmente, para los
microcontroladores de las familias PIC17Cxxx y PIC18Cxxx, se podrn
mover datos desde un archivo de PC a travs del emulador hacia la

347

memoria especfica (target) o desde la memoria especfica hacia un


archivo de PC.

Export

Exporta
Seleccione File > Export para salvar la memoria de trazo (trace buffer)
o archivo .hex.

Print

Imprime
Seleccione File > Print para imprimir alguna parte o todo el archivo
corriente en la impresora previamente seleccionada.
El dilogo de impresin permite especificar los detalles de cmo ser
impreso el archivo y sobre cual impresora. Por default, MPLAB utiliza
la misma impresora que fu seleccionada la ltima vez que se imprimi
un archivo. Los detalles de impresin tales como encabezados, sern
tomados desde la ventana de modos puestos desde la ventana
corriente.
El dilogo muestra el nombre de la impresora que MPLAB esta
utilizando actualmente. Si no se ha especificado alguna otra cosa, sta
ser la impresora predeterminada del sistema.
El archivo ser impreso utilizando el mismo ancho del tabulador (TAB)
usado en la ventana y con los mismos nmeros de lneas, si se ha
habilitado la opcin de numeracin. Para configurar estos parmetros,
seleccione Options > Current Editor Modes.

Print Setup

Configuracin de la impresin
Seleccione File > Print Setup para configurar los detalles de la
impresora que MPLAB utilizar, los cuales sern salvados en disco. El
dilogo de configuracin de la impresin permitir especificar:
Que impresora ser utilizada.
Que mrgenes de pgina sern aplicados cuando sea utilizada
esa impresora.
Que tipo de letra (font) se usar con esa impresora.

Exit

Salida
Seleccione File > Exit para terminar la sesin de MPLAB. Si cualquiera
de los archivos con los que se estuviera trabajando hubieran cambiado
y no se hubieran salvado a disco, MPLAB preguntar si se desean
guardar los cambios, descartarlos o cancelar la operacin. Asimismo,
se preguntar si se desea salvar el proyecto actual.

Simulador del sistema MPLAB


El MPLAB-SIM es un simulador de evento discreto para las familias de microcontroladores PIC
y esta contenido como una parte del ambiente de desarrollo integrado (IDE). Esta herramienta
de simulacin fu diseada para:

Operar con el modelo de los microcontroladores PIC fabricados por MICROCHIP


TECHNOLOGIES INC.

348

Asistir al usuario en depuracin (debugging) de programas de aplicacin que utilizan


los microcontroladores PIC.

A diferencia de los emuladores in-circuit como el MPLAB-ICE, un simulador de evento


discreto esta diseado para depurar programas de aplicacin. MPLAB-SIM permite modificar el
cdigo objeto e inmediatamente re-ejecutar, inyectar estmulos externos al procesador
simulado y hacer un trazo de la ejecucin del cdigo objeto. Un simulador difiere de un
emulador in-circuit en cuatro importantes reas:
Tiempos de entrada/salida (I/O)
Los tiempos externos (external timing) en MPLAB-SIM son procesados solo una vez durante
cada ciclo de instruccin. Las seales transitorias, tales como picos (spikes) sobre el pin MCLR
ms pequeas que un ciclo de instruccin, no sern simuladas pero si podrn ser atrapadas
por un emulador in-circuit.
Nota:

Los estmulos son inyectados en el MPLAB-SIM antes del prximo ciclo de instruccin.

Velocidad de ejecucin
Cuando el sistema este corriendo en tiempo real en el modo simulador, las instrucciones sern
ejecutadas tan rpido como sea posible por el CPU de la PC. Esto es usualmente ms lento de
lo que un microcontrolador PIC podra correr a su velocidad de reloj real.
La velocidad a la que el simulador correr depender de la velocidad de la computadora y de
cuantas otras tareas se estn ejecutando al mismo tiempo. El programa del simulador deber
actualizar todos los registros simulados y la memoria RAM, as como monitorear las
entradas/salidas (I/O), prender y apagar banderas, revisar por puntos de trazo (trace) y
rompimiento (break) en el programa y simular las instrucciones del microcontrolador PIC con
instrucciones ejecutadas por el CPU de la PC.
La velocidad de ejecucin de un programa de simulacin de evento discreto ser mucho ms
lenta que la de un emulador in-circuit cuya solucin esta orientada hacia el hardware. Sin
embargo, esta menor velocidad podr ser vista como una desventaja o como una herramienta.
MPLAB-SIM intenta proporcionar el ciclo ms rpido de simulacin posible y dependiendo del
modo de operacin, podr operar en el orden de los milisegundos por instruccin.
Nota:

A menudo las mallas cerradas (loops) son utilizadas en el cdigo para generar retardos
de tiempo. Cuando sea utilizado el simulador, se podra desear decrementar esos
retardos de tiempo o condicionalmente remover esas secciones de cdigo con
declaraciones IFDEF para incrementar la velocidad de la simulacin.

En general, cuando se dice tiempo real y se est en el modo de simulacin, la simulacin del
programa de aplicacin del microcontrolador PIC se estar ejecutando tan rpido como la PC
pueda simular las instrucciones.
Costo
MICROCHIP TECHNOLOGIES INC. ha desarrollado el simulador MPLAB-SIM para ser la
herramienta ms econmica para depuracin de programas de aplicacin. MPLAB-SIM no
requiere de ningn dispositivo (hardware) externo a la PC y opera en muchos aspectos muy
similar al emulador MPLAB-ICE. A menos que se requiera correr la aplicacin en tiempo real

349

con su hardware asociado, el simulador MPLAB-SIM podr ser utilizado para encontrar y
corregir muchos errores de cdigo.
Herramienta de depuracin (debugging)
MPLAB-SIM es particularmente adecuado para optimizacin de algoritmos. A diferencia de un
emulador, el simulador hace visible muchos registros internos y proporciona algunas
herramientas de programa que son difciles o costosas de implementar en un emulador incircuit. Para la mayora de los casos, el simulador MPLAB-SIM podr ser utilizado para
depurar completamente el sistema de aplicacin a menos que se requiera resolver tpicos de
tiempo real o situaciones de perifricos externos en donde ser requerido un emulador incircuit.
Modo de animacin
El modo de animacin es un mtodo en donde el procesador automticamente corre paso a
paso. De hecho, el simulador ejecuta pasos sencillos mientras se encuentra en modo correr
(Run), pero nicamente actualizar los valores de los registros cuando sea detenido (halted).
Para observar el cambiar de los registros en la ventana de los registros de funcin especial o
las ventanas de observacin (Watch Windows), utilice el modo de animacin. En este modo
correr ms lento que con la funcin Run, pero permite ver el cambiar de los valores de los
registros.
Ejecucin del simulador sobre los linderos del ciclo de instruccin
MPLAB-SIM ejecuta sobre los linderos del ciclo de instruccin por lo que resoluciones ms
pequeas que un ciclo de instruccin (TCY) no podrn ser simuladas. MPLAB-SIM es un
simulador de evento discreto en donde los estmulos son evaluados y todas las respuestas son
generadas en los linderos de la instruccin, o TCY = 4 TOSC, donde TOSC es el periodo del reloj
de entrada. Por consiguiente, algunos eventos fsicos no podrn ser simulados con precisin,
los cuales caen dentro de las siguientes categoras:

Eventos puramente asncronos.


Eventos que tienen periodos ms cortos que un ciclo de instruccin.

El resultado neto de la simulacin sobre los linderos de la instruccin es que todos los eventos
son sincronizados a los linderos de la instruccin y los eventos ms pequeos que un ciclo de
instruccin no son reconocidos.
Las siguientes funciones y perifricos entre todas las familias de microcontroladores PIC son
afectadas por los linderos del ciclo de instruccin:

Los pulsos de reloj ms pequeos que un ciclo no podrn ser simulados aunque los
pre-escaladores del temporizador sean capaces de aceptar dichos pulsos.
Los pulsos de salida PWM menores de un ciclo no son soportados.
Las comparaciones mayores de 8 bits no son soportadas.
En el modo de contador no sincronizado, las entradas del reloj menores de un ciclo no
podrn ser usadas.
Las formas de onda del oscilador sobre los pines RC0/RC1 no podrn ser mostradas.
MPLAB-SIM no simula una entrada/salida (I/O) serial.

350

Funciones de estimulo del simulador


Las funciones del simulador MPLAB-SIM permiten configurar las seales de estimulo as como
responder a eventos desde archivos en la PC. Los archivos podrn ser escritos con el editor
MPLAB y debern ser salvados en el mismo directorio del proyecto.
Los estmulos generarn seales para el simulador. Se podrn poner los pines en estado alto o
bajo e inyectar valores directamente en los registros. Existen cuatro tipos de estmulos:

Dilogo de estmulos asncronos Un dilogo interactivo para controlar seales sobre


pines de entrada.

Archivo de estmulos a pines El contenido de un archivo de texto describe las seales


en los pines de entrada.

Archivo de estmulos a registros El contenido de un archivo de texto es usado para


poner valores de 8 bits directamente dentro de un registro.

Estmulos al reloj Una fuente regular, programable y peridica de pulsos de estmulo.

Dilogo de estmulos asncronos


Esta clase de estmulos son proporcionados mediante un dilogo con un botn para simular
+5V y 0V aplicado a uno o varios pines de entrada. Conforme se ejecute el programa de
aplicacin con el simulador, se podrn presionar los botones para cambiar los niveles sobre los
pines.
El dilogo contiene 12 botones de estmulos a pines definibles por el usuario. Cada botn es
configurado para actuar sobre un pin especfico del microcontrolador simulado. Una vez que el
pin ha sido elegido, el operador deber seleccionar la accin a ser aplicada cuando se haga
click en el botn del dilogo. Cada botn podr ser configurado en cualquier momento y ms
de un botn podr ser registrado a un solo pin del procesador.
Acciones de estmulos asncronos
Existen cuatro acciones de estmulos asncronos disponibles:
Pulse
High
Low
Toggle

Cambiar el estado del pin a su opuesto y regresar.


Cambiar el estado del pin a alto.
Cambiar el estado del pin a bajo.
Cambiar el estado del pin a su opuesto.

Usando estmulos asncronos


Los pasos para configurar un pin asncrono son:
1. Abra el dilogo de estmulos asncronos.
2. Haga click en el botn derecho del ratn sobre el botn que se desea configurar.
3. Seleccione Assign Pin desde el men desplegado.

351

4. Haga doble click sobre el nombre del pin dentro de la lista presentada.
5. Haga click en el botn derecho del ratn sobre el mismo botn seleccionado
previamente.
6. Seleccione una accin a ser aplicada al estmulo del pin configurado.
Mientras se encuentre corriendo la simulacin, haciendo click en el botn del estmulo
asncrono configurado causar que la accin sea aplicada a dicho pin.
Ejemplo de estmulos asncronos
Como un ejemplo, configuraremos una seal que har la accin de Toggle con el nivel sobre
un pin del puerto PORTB.
1. Seleccione Debug > Simulator Stimulus > Asynchronous Stimulus. Ahora ponga el
cursor sobre el botn etiquetado Stim1 (P) y haga click con el botn derecho del
ratn. Un men ser desplegado. Desplace hacia abajo y haga click sobre Toggle.
2. Otra vez ponga el cursor sobre el botn etiquetado Stim1 (T) (la P fu remplazada
por la T, significando Toggle), presione el botn derecho del ratn y seleccione
Assign Pin. Un dialogo con una lista de pines del microcontrolador ser desplegado.
Ponga el cursor sobre RB0 y haga doble click. Ahora, el dilogo de estmulos
asncronos debera mostrar RB0 (T).
3. Seleccione Debug > Run > Animate para lograr que el procesador corra en un modo
paso a paso rpido. La barra de estado alternar run a stop muy rpido.
4. Presione el botn RB0 (T) sobre el dilogo de estmulos asncronos. Se deber ver el
valor del puerto PORTB en la ventana de los registros de funcin especial, cambiar su
valor cada vez que se hace click en el botn, simulando una seal alta y
posteriormente una seal baja aplicada al pin 0 del puerto PORTB.
Archivo de estmulos a pines
Un archivo de estmulos a pines consiste de entrada de 1s y 0s que se aplicarn a pines
cuando el valor Cycle en el cronmetro coincida con la columna CYCLE.
Creando un archivo de estmulos a pines
1. Seleccione File > New File. Una ventana intitulada aparecer. Se crear el archivo de
estmulos a pines en esta ventana.
2. Escriba la palabra CYCLE en la primera lnea de la ventana del archivo intitulado.
Nota:

Por compatibilidad con las primeras versiones del simulador, la primera lnea
deber siempre empezar con la palabra CYCLE o STEP. Esta columna
especificar el ciclo (CYCLE) (como fu determinado por la ventana del
cronmetro de MPLAB) donde los valores en las otras columnas sern
aplicados.

3. A la derecha de la palabra CYCLE escriba el nombre del pin del microcontrolador PIC
que recibir el valor alto del estmulo. El tercero y ltimo campo de la primera lnea del

352

archivo ser el pin del microcontrolador PIC que recibir el valor bajo del estmulo.
Estos nombres debern coincidir con los nombres del microcontrolador PIC simulado,
usados por MICROCHIP.
Nota:

Para ver la lista de pines soportados, seleccione Debug > Simulator Stimulus
> Asynchronous y haga click en el botn derecho del ratn sobre el botn de
estmulos (stimulus).

4. En las lneas sobrantes del archivo, escriba los ciclos durante los cuales los pines
recibirn el estmulo, seguidos por los valores alto y bajo. Es posible poner comentarios
sobre la lnea utilizando el carcter ; o ! precedido y seguido por al menos un
carcter de espacio.
5. Seleccione File Save As... para salvar el archivo. Seleccione la unidad de disco y el
flder en el cual el archivo ser almacenado e introduzca el nombre del archivo que se
desee asignarle. Dle al archivo una extensin .sti. Asegurese de que el formato UNIX
no sea seleccionado. El archivo ahora estar listo para usarse.
Usando un archivo de estmulos a pines
1. Seleccione Debug > Simulator Stimulus > Pin Stimulus > Enable para habilitar el
archivo de estmulos a pines.
2. Abra la ventana del cronmetro seleccionando Window > Stopwatch. Tambin
seleccione Window > Special Function Registers. Observe en el puerto que los pines
estn encendidos, o simplemente agregue el puerto que tiene los pines encendidos a
una ventana de observacin (Watch Window). La ventana del cronmetro mostrar el
tiempo transcurrido de cada instruccin, de acuerdo a lo determinado con el valor de
CYCLE y la frecuencia del reloj. Si el cronmetro fuese inicializado a 0, el archivo de
estimulo a pines tambin lo ser.
3. Inicialice (Reset) y seleccione paso a paso (single step). El puerto cambiar su valor de
acuerdo a lo programado en el archivo de estmulos.
Ejemplo del archivo de estmulos a pines
1. Seleccione File > New File y escriba el siguiente texto. No es necesario escribir los
textos posteriores a los caracteres delimitadores de comentarios ; y !, sin embargo
es buena idea incluirlos en el archivo.
CYCLE
20
41
52
55
60
65
76

RB1
0
1
0
1
0
1
0

RB0
0
0
1
1
0
0
1

; aplica un nivel alto al PORTB bit1


; aplica alto al bit0 y bajo el bit1
; Toggle bit0, entonces ....
; . Toggle bit0.

Despus de la palabra CYCLE en la primera lnea del archivo se encuentran los nombres
de los pines para el microcontrolador PIC que recibirn los valores de los estmulos alto y
bajo. En este ejemplo los pines RB1 y RB0, dos entradas del puerto PORTB, recibirn los
estmulos de entrada.

353

Nota:

Por razones de compatibilidad con anteriores versiones del simulador, la


primera lnea siempre deber empezar con la palabra CYCLE o STEP.

En este archivo, la segunda columna tendr los valores que sern aplicados a RB1
(PORTB bit 1) y la tercera columna tendr los valores que sern aplicados a RB0 (PORTB
bit 0). Estos nombres debern coincidir con los nombres de pines usados por MICROCHIP
en sus familias de microcontroladores PIC. Para ver una lista de todos los pines
soportados, haga click con el botn derecho del ratn sobre un botn de estmulos.
2. Seleccione File > Save As... para salvar el archivo.
3. Seleccione Debug > Simulator Stimulus > Pin Stimulus > Enable para habilitar el
archivo de estmulos a pines.
4. Abra la ventana del cronmetro seleccionando Window > Stopwatch. Tambin
seleccione Window > Special Function Registers. Observe el puerto PORTB o
simplemente agregue el puerto PORTB a una ventana de observacin (Watch
Window).
La ventana del cronmetro tambin mostrar el tiempo transcurrido de cada
instruccin, de acuerdo a lo determinado por el valor de CYCLE y la frecuencia del
reloj. Si el cronmetro fuese inicializado (reset) a 0, el archivo de estmulos tambin
ser inicializado.
5. Inicialice (reset) y seleccione el modo paso a paso (single step) hasta que sean
ejecutados 41 ciclos. El puerto PORTB cambiar su valor segn lo estipulado a partir
de la lnea dos del archivo de estmulos.
Archivo de estmulos a registros
Un archivo de estmulos a registros consiste de una sola columna de valores que sern
enviados a un registro cuando la direccin de la memoria de programa encuentre la localidad
indicada en el dialogo de registros de estmulo. Esto es til para simular una operacin de
conversin A/D.
Creando un archivo de estmulos a registros
1. Seleccione File > New File. Un ventana intitulada aparecer en pantalla. Se crear el
archivo de estmulos a registros en esta ventana.
2. En la ventana intitulada, escriba la lista de valores que desee insertar en un registro.
Asegurese de que el orden de los valores sea el que usted desea insertar en el
registro.
3. Seleccione File > Save As... para salvar el archivo. Seleccione la unidad de disco y el
flder en el cual el archivo ser almacenado e introduzca el nombre del archivo que se
desee asignarle. Dle al archivo una extensin .reg. Asegurese de que el formato UNIX
no sea seleccionado.
Usando un archivo de estmulos en un registro
1. Seleccione Debug > Simulator Stimulus > Register Stimulus > Enable para abrir un
dilogo de estmulos a registros.

354

2. En la caja de direccin de la memoria de programa, introduzca la direccin en el


programa donde los valores de los estmulos sern inyectados.
3. En la caja de direccin del registro, seleccione la direccin del registro donde los
valores sern inyectados.
4. Seleccione Window > File Registers para abrir la ventana del archivo de registros y
poder observar los efectos de los estmulos.
5. Inicialice (reset) y seleccione el modo paso a paso (single step). Cada vez que sea
encontrada la direccin de la memoria de programa, el valor en el registro de fila en la
direccin que fu especificado cambiar. La lista de valores en el archivo de estmulos
a registros ser secuencialmente inyectado dentro del registro de fila seleccionado.
Despus del que el ltimo valor en el archivo de estmulos a registros haya sido
inyectado, el primer valor ser utilizado otra vez. La lista se ciclar continuamente todo
el tiempo en que el MPLAB-SIM sea ejecutado.
Ejemplo de un archivo de estmulos a registros
1. Cree un nuevo archivo con File > New File y escriba la siguiente lista de nmeros:
10
2E
38
41
50
7A
99
A0
FD
2. Seleccione File > Save As... para salvar el archivo y nmbrelo tutor84.reg. Este
archivo ser usado para inyectar secuencialmente estos valores a un registro.
3. Seleccione Debug > Simulator Stimulus > Register Stimulus > Enable..., entonces
ponga loop (una etiqueta en el programa de muestra tutor84.asm, mostrado abajo)
para indicar el lugar donde los valores sern inyectados, y para propsitos de
demostracin, stos valores sern inyectados en el registro cuya direccin ser 0x0D.
Despus de poner loop y 0x0D en las cajas apropiadas, haga click en Browse para
traer el dilogo del archivo y entonces seleccione tutor84.reg como el archivo de
estmulos a registros.
4. Seleccione Window > File Registers para abrir la ventana de registros de fila y
observar el efecto de estos estmulos.
5. Inicialice (reset) y seleccione el modo paso a paso (single step) en el procesador. Cada
vez que sea encontrada la direccin de la etiqueta loop, el valor en el registro de fila
en la direccin 0x0D cambiar. La lista de valores en el archivo tutor84.reg sern
secuencialmente inyectados dentro del registro de fila seleccionado. Los valores 0x10,
0x2E, etc. sern inyectados en el registro seleccionado en el dialogo Debug >
Simulator Stimulus > Register Stimulus cada vez que loop sea ejecutado.

355

Despus de que el ltimo valor sea inyectado (0xFD en el archivo tuto84r.reg), el


primer valor ser utilizado otra vez (0x10). La lista ser ciclada todo el tiempo en que
MPLAB-SIM sea ejecutado.
El cdigo fuente del programa de muestra tutor84.asm se presenta a continuacin:
;------------------------------------------------list
p=16f84A
include <p16F84A.inc>
c1
equ
0x0c
reset

start
loop

org

0x00

goto

start

org

0x04

movlw 0x09
movwf c1
incfsz c1,F
goto
loop

; Incrementa el contador, pone el resultado en el registro


; hazlo continuamente hasta que el registro sea 0.

goto

start
end
;------------------------------------------------Estmulos al reloj
Los estmulos al reloj generan una forma de onda regular sobre un pin con un ciclo de trabajo
que es especificado en trminos de ciclos de reloj del procesador.
Campos del dilogo de estmulos al reloj
El dilogo de estmulos al reloj contienen los siguientes campos de datos de entrada.
Pin Selection
High Stimulus Clock Count
Low Stimulus Clock Count
Stimulus Invert

Pines disponibles para aplicar el estmulo.


Nmero de pulsos de reloj en estado alto que sern
aplicados.
Nmero de pulsos de reloj en estado bajo que sern
aplicados.
Invierte las selecciones alta y baja.

Botones del dilogo de estmulos al reloj


Los botones del dilogo tienen las siguientes funciones:
Add

Agrega los campos de entrada de reloj a la lista de


estmulos al reloj.

356

Delete
Open
Save
Help
Close

Remueve el estmulo al reloj seleccionado.


Pregunta por un archivo de estmulos al reloj
para cargar en la lista de estmulos al reloj.
Pregunta por un archivo de estmulos al reloj
para salvar la lista de estmulos al reloj.
Abre un archivo de ayuda.
Enva la lista de estmulos al reloj hacia el
simulador y cierra el dilogo.

Usando los estmulos al reloj


Seleccione Debug > Simulator Stimulus > Clock Stmulus y entre la secuencia de reloj para
varios estmulos al reloj en el dilogo de estmulos al reloj. Esta configuracin se repetir hasta
que salga del MPLAB o sea borrada utilizando el dilogo de estmulos al reloj.
Para agregar un estmulo, seleccione el pin en la lista de pines, ponga en alto y bajo la
secuencia de reloj y haga click en Add.
Para borrar un estmulo, seleccinelo y haga click en Delete.

357

358

28

Proyecto

El objetivo principal de este captulo es el de mostrar a travs de un ejemplo, el procedimiento


necesario para lograr que un sistema previamente definido pueda ser implementado. Esto se
podr lograr mediante el anlisis de sus caractersticas y el diseo de los circuitos necesarios
para que el sistema pueda funcionar adecuadamente. Siempre se ha dicho, y con mucha
razn, que un ejemplo es mucho ms ilustrativo que una gran cantidad de palabras explicativas
generalizadas. De hecho, si una persona tuviera algn conocimiento de microcontroladores,
solo con estudiar este captulo podra lograr comprender y aprender a disear con el
microcontrolador PIC, ya que todos y cada uno de los captulos restantes que integran este
libro, contienen informacin tcnica de referencia. Es decir, supongamos por un momento que
quisiramos implementar el circuito oscilador del sistema. En este ejemplo se indica y muestra
cmo, pero sin una explicacin muy extensa y profunda. Si quisiramos saber ms acerca de
osciladores, entonces podramos recurrir al captulo dedicado a este tema. Ah encontraramos
una ms amplia informacin, y sera el usuario el que decidira que grado de profundidad
necesita o desea conocer el tema.
Otro aspecto til que podra obtenerse de este captulo radica en que el programa mostrado
aqu, podra servir como base o plantilla para desarrollar otra aplicacin diferente, borrando el
cdigo que no se necesite y dejando el cdigo que pudiera ser comn con la nueva aplicacin,
ya que arrancar una aplicacin a partir de cero, generalmente toma mayor tiempo y
experiencia.
El proyecto
En este captulo se presentar el desarrollo de un sistema basado en el microcontrolador
PIC16F84 o PIC16F84A, el cual fu elegido por ser un microcontrolador popular con memoria
FLASH, el cual puede ser borrado y reprogramado elctricamente (por el propio programador)
sin que se requiera de una lmpara de luz ultravioleta (UV) necesaria para borrar los
microcontroladores con memoria EPROM de ventana, ya que el costo entre ambas versiones
no difiere mucho.
El diseo del sistema que se presenta a continuacin consiste en una aplicacin con tres
funciones distintas, seleccionables mediante un botn. Las tres funciones que ser capz de
ejecutar el sistema son:
1. Reloj digital de tiempo real (Hrs/Min) con alarma programable (similar al de un
radio despertador), que al detectar el tiempo de la alarma, se activar un relevador de
salida.
2. Contador digital de cuatro dgitos que se incrementa mediante la deteccin de
pulsos en un pin de entrada. La aplicacin ms tpica sera la de llevar un conteo del
turno de atencin a clientes (en una tienda) cada vez que un botn externo sea
presionado. Adicionalmente, usando los botones de PREVIO y SIGUIENTE, el
contador podr ser manipulado. Finalmente con el botn ENTRAR se podr iniciar el
conteo (0000).

359

3. Programar los parmetros involucrados en la primera funcin.


El sistema estar integrado por un microcontrolador PIC, dos registros de corrimiento de 8 bits
cada uno, cuatro unidades de despliegue de 7 segmentos y punto decimal, un regulador de
voltaje de 5VDC, un relevador con interruptor de un polo dos tiros, cuatro interruptores de
presin (push buttons), una lmpara indicadora bicolor (LED) y circuitos asociada, segn se
muestra en el esquemtico mostrado en el ltimo captulo.
Este sistema pretende ser de gran utilidad y corresponde a una aplicacin en donde se
implementan varias funciones tpicas de una manera sencilla mediante un microcontrolador,
tales como:

Un reloj de tiempo real utilizando las interrupciones del temporizador TMR0.


Manejo de los puertos digitales de entrada/salida (I/O).
Uso del temporizador TMR0 en el modo contador.
Unidad de despliegue refrescada peridicamente.
Manejo de un teclado sencillo de 4 botones.
Manejo de un relevador de salida.
Manejo de una entrada digital.
Manejo de una salida digital.

Recordemos que la capacidad de la memoria de programa del microcontrolador seleccionado


se encuentra limitada a 1K (palabras) y que desafortunadamente no podemos extender con
demasiadas funciones esta aplicacin. No obstante, las funciones aqu presentadas nos
permiten mostrar como fueron implementadas y as lograr su fcil comprensin.
Las partes utilizadas en este proyecto son muy populares y podrn conseguirse en casi
cualquier tienda de electrnica (STEREN por ejemplo) y su costo no es muy alto por lo que
cualquier estudiante podr construirlo.
Se recomienda construir este sistema en una tablilla de prototipos (PROTO BOARD) para su
fcil y rpida construccin, aunque existe la posibilidad de armar dicho prototipo, de una
manera permanente, sobre una lmina multiperforada y alambrarla (ver foto en el captulo final
de este libro).
El microcontrolador
Como se mencion anteriormente, el microcontrolador elegido fu el modelo PIC16F84A, el
cual posee las siguientes caractersticas:

1024 palabras (1K) de memoria de programa.


68 bytes de memoria RAM.
64 bytes de memoria EEPROM.
Palabras de Instruccin de 14 bits.
13 puertos de entrada/salida (I/O).
Frecuencia del oscilador 10 MHz (PIC16F84) y 20 MHz (PIC16F84A).

360

Figura 28.1 Diagrma de bloques del microcontrolador PIC16F84A

361

Tabla 28.1

Descripcin de los pines del PIC16F84A

La figura 28.1 nos muestra el diagrma de bloques del microcontrolador mientras que la tabla
28.1 nos muestra la descripcin de todos y cada uno de sus pines.
Las interfases y sus circuitos (Hardware)
En esta seccin se pretende explicar con ms detalle cada una de las secciones que integran
el sistema completo. De esta manera dividiremos el sistema en las siguientes secciones:

Oscilador del sistema.


Circuito de arranque (Reset).
Unidad de teclado de 4 botones.
Unidad de despliegue de 4 dgitos.
Manejador (Driver) del relevador de salida.
Regulador de voltaje de alimentacin (+5V).
Lmpara indicadora de tres colores (LED bicolor).
Bits de entrada/salida digital.

362

Oscilador del sistema


El microcontrolador PIC16F84A puede ser operado en uno de cuatro diferentes modos del
oscilador. La opcin ms econmica sera utilizar el modo RC (Resistencia/Capacitor), sin
embargo, debido a que nuestra aplicacin es absolutamente sensible al tiempo (ya que
tendremos un reloj de tiempo real que deber ser muy preciso), esta opcin queda descartada.
Si observamos en el diagrma esquemtico del circuito del sistema, veremos que en los pines
15 (OSC2) y 16 (OSC1) se encuentra conectado un cristal cuya frecuencia de resonancia es de
4 MHz. Este cristal fu elegido con base en la frecuencia mxima de operacin del modelo
elegido (es decir, la ptima), ya que el programa de aplicacin deber desarrollar varias tareas
y deseamos asegurar que stas las podr ejecutar adecuadamente.
Observe tambin en el diagrma esquemtico que existen dos capacitares de 33uf cada uno,
los cuales se encuentran conectados de los pines del cristal a tierra. Estos capacitares sirven
para darle estabilidad al circuito oscilador y son recomendados por MICROCHIP.
Circuito de arranque (Reset)
El pin 4 denominado MCLR (Master Clear) cuyo estado activo es bajo, permite que el
microcontrolador pueda ser llevado a un estado conocido de inicio. El uso tpico de este pin se
enfoca en dos condiciones bsicas:

Deteccin de un voltaje de alimentacin por debajo del umbral permitido, que


ocasionara un mal funcionamiento del microcontrolador.

Deteccin de un evento externo que requiriera de la inhabilitacin del microcontrolador


o bien la necesidad de arrancar el sistema desde su inicio.

Como se podr ver, este pin es de gran utilidad para el microcontrolador ya que la funcin que
realiza, permite que la aplicacin opere de manera confiable y segura bajo diversas
condiciones externas. Por ejemplo, imaginemos en el arranque del microcontrolador, cuando el
voltaje de alimentacin es aplicado al sistema. Este ir subiendo de nivel gradualmente hasta
llegar a rebasar el umbral de operacin. En todo este tiempo, si la accin de la funcin de este
pin no estuviera presente, el microcontrolador arrancara con un nivel de voltaje de
alimentacin dudoso y podra tener un mal funcionamiento. Pero con la accin de la funcin
denominada Arranque POR (Power-on Reset) de este pin se puede prevenir este problema,
ya que este pin permanecer en su estado bajo (activo) mientras no se alcance un nivel de
voltaje de alimentacin operativo adecuado. Adicionalmente a esta funcin, existe otra
denominada Temporizador de encendido (Power-up Timer) que proporciona una accin de
tiempo fuera de 72 milisegundos nominal (TPWRT) a partir del Arranque POR, en el cual este
pin permanecer en su estado activo bajo. Al final de este retardo, el pin MCLR se levantar a
su estado inactivo y el microcontrolador iniciar la ejecucin del cdigo del programa de
aplicacin a partir del vector de arranque (Reset vector) en la localidad 0x0000.
Para el caso anterior, en donde exista una fuente de alimentacin con una relacin de subida
rpida, este pin bastar con conectarse a VDD (+5V en nuestro proyecto. Ver diagrma
esquemtico).
Sin embargo, si existiera el caso en que se utilizara una fuente de alimentacin con una
relacin de subida muy lenta, entonces se tendra que conectar de este pin a +5V, una
resistencia menor de 40 kohms, y un capacitor, digamos de 0.1uf, de este pin a tierra (GND).

363

Unidad de teclado de 4 botones


El sistema diseado en este proyecto contiene un pequeo teclado formado por cuatro botones
de presin (push buttons) denominados PB1, PB2, PB3 y PB4, los cuales se encuentran
conectados por un lado a tierra y por el otro a los pines: 8(RB2), 9(RB3), 10(RB4) y 11 (RB5)
respectivamente, por lo que dichos pines debern ser configurados como entradas digitales.
En el diagrma esquemtico se puede observar que estos pines tambin se encuentran
conectados a una resistencia pull-up de 10K cada una.
En esta configuracin, un estado alto estar presente en cada pin y se leer como 1 siempre
y cuando el botn correspondiente est sin oprimir. Cuando algn botn sea oprimido, el pin
correspondiente ser conectado a tierra y se leer un 0.
Una gran ventaja de usar esta configuracin (de un bit por cada botn) es que podrn
detectarse hasta 16 combinaciones posibles, ya que podrn leerse dos o ms botones
presionados a la vez. La siguiente tabla nos muestra lo anterior:
BOTONES
PB4 PB3 PB2

PB1

OFF
OFF
OFF
OFF
OFF
OFF
OFF
OFF
OFF
OFF
OFF
OFF
OFF
OFF
OFF
OFF

OFF
ON
OFF
ON
OFF
ON
OFF
ON
OFF
ON
OFF
ON
OFF
ON
OFF
ON

OFF
OFF
OFF
OFF
ON
ON
ON
ON
OFF
OFF
OFF
OFF
ON
ON
ON
ON

OFF
OFF
ON
ON
OFF
OFF
ON
ON
OFF
OFF
ON
ON
OFF
OFF
ON
ON

PINES
RB5 RB4 RB3 RB2
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1

1
1
1
1
0
0
0
0
1
1
1
1
0
0
0
0

1
1
0
0
1
1
0
0
1
1
0
0
1
1
0
0

1
0
1
0
1
0
1
0
1
0
1
0
1
0
1
0

Estos botones sern usados para seleccionar los diferentes modos de operacin y para
configurar los parmetros programables. De esta manera, cada uno de los cuatro botones
tendrn una funcin especfica, la cual se describe a continuacin:
PB1 MODO (MODE)
Este botn nos permitir seleccionar el modo de operacin pero sin activarlo y cada vez que
sea oprimido este botn, cambiar a un nuevo modo de operacin.
Existen tres modos de operacin del sistema:
1. Reloj digital de tiempo real (Hrs/Min) con alarma programable.
2. Contador digital de cuatro dgitos.
3. Programar los parmetros del reloj digital.

364

PB2 ENTRAR (ENTER)


Este botn nos permite entrar un parmetro previamente seleccionado o bien activar el modo
de operacin. Es decir, al oprimir este botn, el modo que se est desplegando se activar.
En el modo 1
Este botn nos permite desactivar el relevador de salida, si ste se encuentra activado por una
condicin de alarma.
En el modo 2
Este botn es utilizado para inicializar el contador, es decir ponerlo a 0000.
En el modo 3
Este botn es usado para entrar en el parmetro seleccionado (desplegado).
PB3 HRS / PREVIO (PREV)
En el modo 1
Este botn nos permite incrementar la unidad de despliegue correspondiente a las horas (los 2
dgitos ms significantes de la unidad de despliegue). El formato utilizado por el sistema ser el
de 00 a 23 horas, por lo que cada vez que sea oprimido el botn se incrementar en una
unidad hasta llegar a 23, pasando a 00 en el siguiente incremento. Si el botn se mantiene
constantemente oprimido, el contador avanzar ms rpido.
En el modo 2
Este botn es utilizado para decrementar el contador.
En el modo 3
Este botn no es usado.

PB4 MIN / SIGUIENTE (NEXT)


En el modo 1
Este botn nos permite incrementar la unidad de despliegue correspondiente a los minutos (los
2 dgitos menos significantes de la unidad de despliegue). El formato utilizado por el sistema
ser el de 00 a 59 minutos, por lo que cada vez que sea oprimido el botn se incrementar en
una unidad hasta llegar a 59, pasando a 00 en el siguiente incremento. Si el botn se mantiene
constantemente oprimido, el contador avanzar ms rpido.
En el modo 2
Este botn es utilizado para incrementar el contador. Cada vez que este botn es oprimido, se
incrementar en 1 el contador. . Si el botn se mantiene constantemente oprimido, el contador
avanzar ms rpido.

365

En el modo 3
Este botn nos permite desplegar el parmetro a programar. Existen 5 parmetros a
seleccionar:
a)
b)
c)
d)
e)

Tiempo de reloj.
Tiempo de activacin de la alarma.
Tiempo de descativacin de la alarma.
Desactivacin de la alarma.
Activacin de la alarma

Cada vez que el botn sea oprimido, se desplegar en forma consecutiva y cclica, cada uno
de los parmetros antes mencionados.
Unidad de despliegue de 4 dgitos
En este proyecto se encuentra integrada una unidad de despliegue de cuatro dgitos (de 7
segmentos y punto decimal cada uno). Esta unidad esta compuesta por dos registros de
corrimiento (shift registers) de 8 bits cada uno, los cuales alimentan de informacin a la unidad
de despliegue de 4 dgitos de 7 segmentos y nodo comn. En el diagrma esquemtico del
proyecto presentado en el captulo 29, los circuitos integrados (MC14094) U5 y U6
corresponden a los registros de corrimiento y los circuitos integrados (DA03) U1, U2, U3 y U4
corresponden a los cuatro dgitos de la unidad de despliegue, en la posicin que muestra la
figura 28.1. Cada uno de los 8 bits de salida de los registros de corrimiento se encuentran
conectados (a travs de una resistencia limitadora de corriente de 330 ohms) a cada uno de los
segmentos de la unidad de despliegue. De hecho, U5 alimenta de datos a los dgitos U1 y U2
mientras que U6 alimenta a los dgitos U3 y U4. Por otra parte el transistor Q1 activa los dgitos
U2 y U4 mientras que Q2 activa los dgitos U1 y U3. Esto que aparentemente se ve complejo,
en realidad no lo es.
Figura 28.1

U4

Posicin de los cuatro dgitos

U3

U2

U1

Olvidemos de momento toda la estructura de los registros de corrimiento y los transistores de


control de activacin y enfoqumonos nicamente en cmo funciona una sola unidad de
despliegue de 7 segmentos y punto decimal (DP).
Cada segmento en realidad es un diodo emisor de luz (LED) y debido a que esta unidad de
despliegue usa la configuracin de ctodo comn, todos sus ctodos se encuentran unidos
entre si, segn se muestra en la figura 28.2.

366

Figura 28.2 Unidad de despliegue de 7 segmentos

Si asociamos la figura 28.2 con el diagrma esquemtico del proyecto podremos observar que
el nodo comn (AC) de las unidades de despliegue se encuentra conectado a +5V a travs
del transistor PNP (Q1 y Q2). Por otro lado, todos los ctodos de los diodos se encuentran
conectados a una resistencia limitadora de corriente de 330 ohms cada uno, las cuales a su
vez van conectadas a las salidas del registro de corrimiento. Para que exista circulacin de
corriente a travs de los diodos (y stos puedan encender), la salida del registro de corrimiento
deber estar en el estado bajo (a tierra). La figura 28.3 muestra este ejemplo.
Figura 28.3

Ejemplo de la conexin del segmento a

Es decir, tendremos una lgica invertida en el encendido de los diferentes segmentos de la


unidad de despliegue, lo que deber ser recordado ms adelante, cuando sea explicado el
programa de aplicacin.
Volviendo a la explicacin, cada registro de corrimiento de 8 bits sujetar, en un momento
dado, un byte de dato, el cual a su vez prender/apagar los segmentos conectados a dicho
registro. Pero debido a que dos dgitos de la unidad de despliegue se encuentran conectados
en paralelo a un mismo registro de corrimiento, Qu dgito estar activo en ese momento? La
respuesta es: aquel dgito cuyo nodo comn se encuentre activo (con +5V), es decir, aquel
dgito cuyo transistor PNP (Q1 para los dgitos U2 y U4 y Q2 para los dgitos U1 y U3)
conectado al nodo comn (AC) que se encuentre activo. Esta activacin se logra mediante la
seal de control AC_H (generada por el bit RA3, pin 2 del microcontrolador U7). Cuando la
seal AC_H se encuentre en estado bajo (0) y se aplique a la base del transistor PNP Q1,
ste se activar y permitir dejar pasar +5V al pin del nodo comn (AC) de los dgitos U2 y
U4.
Contrariamente, cuando la seal AC_H se encuentre en alto (1) el transistor Q1 estar
inactivo pero el transistor NPN Q3 (configurado como un inversor), generar la seal AC_L que
corresponder al inverso de la seal AC_H. En este caso, La seal AC_L se aplicar a la base
del transistor PNP Q2 el cual se activar y permitir dejar pasar +5V al pin de AC de los dgitos
U1 y U3.

367

Lo anterior puede resumirse de la siguiente manera:


El dgito U4 desplegar el dato contenido en el registro U6 cuando Q1 se encuentre activo, lo
cual implica que la seal AC_H se encuentre en el estado bajo (AC_H = 0).
El dgito U3 desplegar el dato contenido en el registro U6 cuando Q2 se encuentre activo, lo
cual implica que la seal AC_H se encuentre en el estado alto (AC_H = 1).
El dgito U2 desplegar el dato contenido en el registro U5 cuando Q1 se encuentre activo, lo
cual implica que la seal AC_H se encuentre en el estado bajo (AC_H = 0).
El dgito U3 desplegar el dato contenido en el registro U5 cuando Q2 se encuentre activo, lo
cual implica que la seal AC_H se encuentre en el estado alto (AC_H = 1).
Es decir,
U4
U3
U2
U1

=>
=>
=>
=>

dato en reg U6, AC_H = 0


dato en reg U6, AC_H = 1
dato en reg U5, AC_H = 0
dato en reg U5, AC_H = 1

(Q1 activo)
(Q2 activo)
(Q1 activo)
(Q2 activo)

Finalmente, se explicar como podrn ser enviados los datos hacia los dos registros de
corrimiento U5 y U6, para su despliegue.
Existen tres seales de control generadas por el microcontrolador U7, las cuales sirven para
transferir informacin desde el microcontrolador hacia el registro de corrimiento, Estas seales
son: CLK (RA0, U7-17), DATA (RA1, U7-18) y STB (RA2, U7-1).
La configuracin del registro de corrimiento corresponde a un registro de 16 bits (dos registros
de corrimiento de 8 bits cada uno, conectados en serie) el cual tendr el siguiente formato:
b15 b14 b13 b12 b11 b10 b9 b8 b7 b6 b5 b4 b3 b2 b1 b0
siendo b0 el bit menos significante y el que deber ser enviado primero. Por lo tanto, el byte del
dato correspondiente al registro U5 estar formado por los bits b7-b0, mientras que el dato
correspondiente al registro U6 estar formado por los bits b15-b8.
Cabe mencionar que en un mismo tiempo podrn desplegarse nicamente dos dgitos (los que
se encuentren activados por uno de los dos transistores, Q1 o Q2). As, cuando Q1 este activo,
los dgitos U2 y U4 sern desplegados, mientras que cuando Q2 lo est, los dgitos
desplegados sern U1 y U3. De lo anterior podemos observar que nunca existir el caso en
que los transistores Q1 y Q2 se encuentren activos al mismo tiempo, ya que las seales que
activan dichos transistores son una negada de la otra (AC_H es negada de AC_L).
De acuerdo a las especificaciones tcnicas del circuito integrado MC14094 (registro de
corrimiento U5 y U6), la seal DATA deber presentar el bit de dato a transferir (si se desea
enviar un 1, se deber presentar la seal en alto). En este caso ser una seal unidireccional
(del microcontrolador al registro de corrimiento). La seal CLK corresponder a una seal de
reloj, la cual permitir que el bit de dato, previamente presentado en U6-2 (DATA), sea
capturado en el registro con el flanco de subida (rising edge).
La seal de control STB (U7-1) ser la encargada de transferir el dato contenido en el registro
de corrimiento hacia los latches de salida del registro, una vez que ste haya sido cargado
con los 16 bits del dato. Esta seal deber ser un pulso generado a partir del estado bajo (0 1
0).

368

Ver caracteristcas de los registros de corrimiento en su correspondiente hoja de datos tcnica


(datasheet).
Lo anterior se ver ms claro en el momento de presentar la explicacin de la implementacin
del programa de aplicacin, ms adelante en este captulo.
Manejador (Driver) del relevador de salida
El sistema posee un relevador de salida que controla la conmutacin de un interruptor (1 polo,
dos tiros) capz de manejar hasta 10 Amp .250 VAC. Este relevador es manejado por el
transistor Q4, cuya base se encuentra conectada al pin 13 (bit RB7) del microcontrolador U7 a
travs de una resistencia de 1K.
El bit RB7 (del puerto PORTB), es el encargado de activar/desactivar dicho relevador. Cuando
el bit se encuentre encendido, el relevador se activar y el interruptor contactara el nodo
COMN con el nodo normalmente abierto (NO). Cuando el bit se encuentre apagado, el
relevador estar inactivo (en posicin de reposo) y el interruptor contactar el nodo COMN
con el nodo normalmente cerrado (NC). Ver figura 28.4.
Figura 28.4 Interruptor del relevador de salida

Regulador de voltaje de alimentacin (+5V)


Para alimentar al sistema completo se requerir de una fuente de alimentacin regulada de
+5VDC, la cual es obtenida mediante el circuito integrado MC78L05 (U8). Este circuito de tres
pines es alimentado con una fuente de alimentacin no regulada de +9VDC a travs del pin 1.
El diodo (D1) conectado entre la fuente no regulada y la entrada del regulador, nos sirve
bsicamente para bloquear cualquier voltaje negativo (en el caso de que la polaridad del voltaje
de entrada estuviera invertido) en la entrada del regulador. El pin 2 del regulador U8 es
conectado a tierra. El voltaje de salida (+5V regulado) es obtenido en el pin 3 de U8. Ver
diagrma esquemtico del proyecto en el aptulo 29.
Lmpara indicadora de tres colores (LED bicolor)
Existe una lmpara indicadora (L1) integrada por un LED (Light Emitter Diode) bicolor. Esta
lmpara es controlada por dos bits, RB0 (U7-6) que controla el LED color verde y RB1 (U7-7)
que controla el LED color rojo. Los cuatro diferentes estados que podr tener dicha lmpara
son:

369

RB1

RB0

Estado del LED

0
0
1
1

0
1
0
1

Apagado
Verde
Rojo
mbar

Bits de entrada/salida digital


En el sistema se han dedicado dos bits bidireccionales que podrn ser de entrada para
capturar eventos digitales externos o de salida para controlar digitalmente algn dispositivo
externo. En nuestra aplicacin se utilizarn, un bit de entrada y el otro de salida. Ambos bits se
encuentran unidos (a travs de una resistencia de 1K en el de salida y 330 ohms en el de
entrada) al conector de entrada/salida externa (J2 y J3) de la siguiente manera:
Pin J2
1
2
3

Nombre de seal
GND
DIG_O
DIG_I

Descripcin
Referencia (tierra).
Bit de salida digital.
Bit de entrada digital.

Pin J3
1
2
3

Nombre de seal
NO
COM
NC

Descripcin
Tiro del interruptor del relevador (NO).
Polo del interruptor del relevador (COMN).
Tiro del interruptor del relevador (NC).

370

Diagrma de flujo del programa de aplicacin

INICIO
Definicin de:
- Constantes
- Variables
- Vector de Reset
- Vector de Interrupcin
Inicializacin de:
- Puertos A y B
- Variables (= 0)
Enciende todos los segmentos de la unidad de
despliegue por 2 seg.
Apaga todos los segmentos de la unidad de
despliegue por 1 seg.
Escribe en la unidad de
despliegue el mensaje
"HOLA"
m_1
Refresca el temporizador
de guardia (WDT)
Refresca la unidad de
despliegue (si es tiempo)
Lee el estado de los
botones PB1 a PB4

PB1 oprimido?
(MODO)

SI

m_modo

NO
PB2 oprimido?
(ENTRAR)

NO

371

SI

m_enter

m_modo

Modo
RELOJ?

SI

Escribe mensaje "rLOJ"


en unidad de despliegue

SI

Escribe mensaje "cont"


en unidad de despliegue

SI

Escribe mensaje "ProG"


en unidad de despliegue

NO
Modo
CONTADOR?

NO
Modo
PROGRAMAR?

m1_x

NO

Refresca el temporizador
de guardia (WDT)
Refresca la unidad de
despliegue (si es tiempo)
Lee el estado de los
botones PB1 a PB4

Algn botn
oprimido?

NO

Retardo de 1/4 de seg.

SI
m_1

372

m_enter

Modo
RELOJ?

SI

Ejecuta subrutina
modo_reloj

SI

Ejecuta subrutina
modo_contador

NO
Modo
CONTADOR?

NO
Modo
PROGRAMAR?

SI

NO

m_1

373

Ejecuta subrutina
modo_programar

Subrutina
modo_reloj

m_r0

mr_1
Refresca el temporizador
de guardia (WDT)

Refresca el temporizador
de guardia (WDT)

Refresca la unidad de
despliegue (si es tiempo)

Refresca la unidad de
despliegue (si es tiempo)

Lee el estado de los


botones PB1 a PB4

Lee el estado de los


botones PB1 a PB4

SI

NO

Algn botn
oprimido?

NO

Algn botn
oprimido?

SI

Contador de segundos = 0
PB1 oprimido?
(MODO)

Enciende lmpara
ROJA

NO

SI

NO
NO PB2 oprimido?

Alarma
habilitada?
AL_ON=1

Desactiva relevador de
salida (RELAY = 0)
Apaga lmpara

(ENTRAR)

SI

SI

Enciende lmpara
MBAR

Desactiva relevador de
salida (RELAY = 0)

Regreso de
subrutina

rj_0
Inicializa contadores de reloj
con valores programados

NO

rj_1
Actualiza unidad de
despliegue

Contador de
segundos=60?

SI
Contador de segundos = 0

NO

Alarma
habilitada?
AL_ON=1

SI

Incrementa contador de
minutos en 1

NO
m_r0

Contador de
minutos=60?

A
SI

Contador de
horas = 24?

Contador de minutos = 0
Incrementa contador de
horas en 1

SI
Contador de horas = 0

rj_1

374

NO

Relevador
apagado?
(RELAY=0)

rj_4

NO

SI
m_r0

NO

Tiempo de
desactivar
alarma?

Tiempo de
activar alarma?

SI
Desactiva relevador
de salida (RELAY=0)

SI
Alarma
habilitada?
(AL_ON=1)

NO

NO

SI
Activa relevador de
salida (RELAY=1)
Enciende lmpara
V ERDE

375

m_r1

Enciende lmpara
ROJA

Enciende lmpara
MBAR

Subrutina
modo_contador

m_c0

Refresca el temporizador
de guardia (WDT)

ct_0_c

Refresca la unidad de
despliegue (si es tiempo)

Lee puerto de entrada


RA4 (DIG_IN)

Lee el estado de los


botones PB1 a PB4
RA4 = 0?
Algn botn
oprimido?

NO
ct_2_c

SI
Regreso de
subrutina

SI
ct_x_c

Incrementa Contador
en 1

PB1 oprimido?
(MODO)

ct_3_c
NO
PB2 oprimido?
(ENTRAR)

SI
ct_enter_c

NO
ct_2_c

SI

SI

PB4 oprimido?
(SIGUIENTE)

ct_prev_c

NO

Decrementa Contador
en 1
ct_3_c
Actualiza unidad de
despliegue
Enciende lmpara
ROJA
Genera tono de 3 KHz
durante 1/2 segundo

Apaga lmpara

376

Contador = 0

NO

Subrutina
modo_programar

m_p0

Refresca el temporizador
de guardia (WDT)

Refresca la unidad de
despliegue (si es tiempo)

Lee el estado de los


botones PB1 a PB4

NO

Algn botn
oprimido?

Inicializa el puntero
de botones

SI
SI
mp_2x

PB1 oprimido?
(MODO)

NO

Apaga banderas de
actividad

PB2 oprimido?
(ENTRAR)

Regreso de
subrutina

SI

mp_enter

NO
NO

PB4 oprimido?
(SIGUIENTE)

SI

mp_sig

Parmetro
trLJ?

SI

mp_1x

m_p_2

Despliega mensaje
"trLJ"

m_p_3

Despliega mensaje
"tAon"

m_p_4

Despliega mensaje
"tAof"

NO
Parmetro
tAon?

SI

NO
Parmetro
tAoF?

SI

NO
Despliega mensaje
"ALon"

NO
m_p_6

Parmetro
ALon?

SI
m_p_5

Despliega mensaje
"ALoF"

B
C

377

B
mp_1x

AL_ON = 0?

NO
Refresca el temporizador
de guardia (WDT)

SI
Enciende punto
decimal en U1

Refresca la unidad de
despliegue (si es tiempo)
Lee el estado de los
botones PB1 a PB4

SI
AL_ON = 1?

NO

Algn botn
oprimido?

NO
SI

Retardo de 1/4 de segundo

Enciende punto
decimal en U1
m_p0

378

mp_enter

Parmetro
trLJ?

SI
m_s_1

Despliega el tiempo
del reloj

m_s_2

Despliega el tiempo
de la activacin de
la alarma

m_s_3

Despliega el tiempo
de la desactivacin
de la alarma

NO
Parmetro
tAon?

SI

NO
Parmetro
tAoF?

SI

NO
Parmetro
ALon?

m_s_5

m_s_0
SI
m_s_4

Actualiza la unidad
de despliegue

NO

mp_3x

AL_ON = 1

AL_ON = 0

Refresca el temporizador
de guardia (WDT)

Enciende punto
decimal en U1

Refresca la unidad de
despliegue (si es tiempo)

m_p0

Lee el estado de los


botones PB1 a PB4

SI

NO

PB2 oprimido?
(ENTRAR)

SI

NO
SI

NO

PB4 oprimido?
(SIGUIENTE)

PB1 oprimido?
(MODO)

SI

NO
prog_sig

Algn botn
oprimido?

prog_prev

mp_2x

379

prog_sig

prog_prev

Incrementa Contador
de minutos en 1

Incrementa Contador
de horas en 1

p_s1
SI
p_s2

PT_RJ = 0?

NO
PT_AON = 1?

p_s4
Salva el tiempo capturado
en el tiempo del reloj

SI
p_s3

NO

Salva el tiempo capturado


en el tiempo de
desactivacin de la alarma
p_s5
Actualiza la unidad de
despliegue
Enciende punto
decimal en U3
Retarde de 1/4 de
segundo

mp_3x

380

Salva el tiempo capturado


en el tiempo de activacin
de la alarma

NO

Subrutina
Refresca

Subrutina
Shift16

RFSH = 1?

NONES = 1?

NO
sh_pares

SI
Deshabilita
interrupciones

SI
Digito = Dig_1

Digito = Dig_2

Enva datos al registro


de corrimiento (shift16)

Subrutina
envia_byte

Subrutina
envia_byte

RFSH = 0

Digito = Dig_3

Digito = Dig_4

Habilita interrupciones

Subrutina
envia_byte

Subrutina
envia_byte

Regreso de
subrutina

Envia pulso de atrapado


(pulso_stb)

sh_2

NO

NONES = 1?

SI

NONES = 1

NONES = 0

AC_H = 0

AC_H = 1

Regreso de
subrutina

381

Subrutina
envia_byte

NO

bit7 = 1?
(de Digito)

SI

NO
s_b7

DATA = 1
(Puerto RA1)

DATA = 0
(Puerto RA1)

bit6 = 1?
(de Digito)

SI

DATA = 0
(Puerto RA1)

NO
s_b6
DATA = 0
(Puerto RA1)

SI

NO

bit1 = 1?
(de Digito)

SI
s_b1

DATA = 1
(Puerto RA1)

DATA = 0
(Puerto RA1)

Envia pulso CLK


(Puerto RA0)

DATA = 1
(Puerto RA1)

s_b2
DATA = 0
(Puerto RA1)

s_b5
DATA = 0
(Puerto RA1)

bit4 = 1?
(de Digito)

SI

Envia pulso CLK


(Puerto RA0)

DATA = 1
(Puerto RA1)

NO

bit2 = 1?
(de Digito)

DATA = 1
(Puerto RA1)

Envia pulso CLK


(Puerto RA0)

bit5 = 1?
(de Digito)

s_b3

Envia pulso CLK


(Puerto RA0)

DATA = 1
(Puerto RA1)

NO

SI

DATA = 1
(Puerto RA1)

Envia pulso CLK


(Puerto RA0)

NO

bit3 = 1?
(de Digito)

Envia pulso CLK


(Puerto RA0)

SI

NO
s_b4
DATA = 0
(Puerto RA1)

bit0 = 1?
(de Digito)

DATA = 1
(Puerto RA1)

s_b0
DATA = 0
(Puerto RA1)

Regreso de
subrutina

382

SI

Subrutina int
(interrupcin)

Subrutina
int_refresca

Salva registro STATUS


y registro W

Decrementa la variable
CntMs_int en 1

Incrementa variable
Int_count en 1
T0IF = 0
(reg. INTCON)

NO

Subrutina
int_tiempo

NO

Int_count=47?

SI
CntMs_int=0?

Int_count = 0
SI
CntMs_int = 8

Retardo de ajuste fino

RFSH = 1

Incrementa variable
Count_10ms en 1

TMR0 = 239

Subrutina
int_refresca
Subrutina
int_tiempo

Regreso de
subrutina

NO

Count_10ms
= 100?

SI

Restaura registro
STATUS y registro W

Count_10ms = 0

Regreso de
interrupcin

Incrementa contador
de segundos

Regreso de
subrutina

383

Subrutina
Lee_PB

NO

Botn MODO
oprimido?
(Pto. RB2)

SI
PB1 = 1

NO

Botn
ENTRAR
oprimido?
(Pto. RB3)

SI
PB2 = 1

NO

Botn PREVIO
oprimido?
(Pto. RB4)

SI
PB3 = 1

NO

Botn
SIGUIENTE
oprimido?
(Pto. RB5)

SI
PB4 = 1

Regreso de
subrutina

384

Cdigo fuente del programa de aplicacin


A continuacin se presenta el listado del cdigo fuente del programa de aplicacin del proyecto,
Este listado esta ampliamente comentado, con la idea de explicar, de manera detallada, el
porque de cada una de las instrucciones.
Este programa es exactamente el mismo que fu utilizado para construir el prototipo que fu
probado para integrarlo en este libro, por lo que el autor garantiza que el sistema funcionar de
acuerdo a lo expuesto en este captulo.
Este programa ya ha sido previamente capturado y se encuentra grabado en el disco compacto
(CD) que acompaa a este libro. Asimismo, el CD contiene los archivos generados por el
ensamblador MPASM, por lo que nicamente ser necesario programar el microcontrolador
PIC16F84A utilizando el archivo Proyecto.hex y un programador de microcontroladores PIC.
Cabe remarcar que el autor no pretende suponer que el proyecto aqu expuesto haya sido
probado bajo una serie muy amplia de pruebas que normalmente se les hace a los diseos de
nuevos productos que sern manufacturados para su venta, por lo que no se hace responsable
de ningn efecto indeseado que surgiera de la operacin del sistema expuesto en este libro.

385

; PROYECTO Version 1.0


; ------------------------------INTRODUCCION-------------------------;
;
;
;
;

Antes de comenzar a describir este programa de aplicacin recordemos


que el ensamblador, al detectar el caracter ';' en una lnea de
cdigo, los caracteres a partir de este caracter y hasta el fin de
la lnea se considerarn como un comentario, por lo que dichos
caracteres sern ignorados.

;
;
;
;
;
;

Este cdigo correspondiente al programa de aplicacin del proyecto


presentado en el libro "DISEANDO CON EL MICROCONTROLADOR PIC"
fu desarrollado por su autor el Ing. Jos Alejandro Vaca Uribe,
en Mayo del 2004. Para mayores detalles de la explicacin de los
circuitos (hardware) del proyecto, refierase al captulo 28
"Proyecto", del libro de referencia.

;
;
;
;
;

El microcontrolador utilizado en este proyecto es el modelo


PIC16F84A. El sistema posee una unidad de despliegue de 4 dgitos de
7 segmentos y punto decimal. Estos 4 digitos se encuentran organizados en dos grupos: los dgitos nones (U1,U3) y los dgitos
pares (U2,U4).

;
;
;
;
;

El control de refresco de la unidad de despliegue es realizado


mediante el bit RA3 (U7-2) cuya seal generada es llamada AC_H.
Esta seal es una onda cuadrada de 4 milisegundos de perodo (250
Hz) con un ciclo de trabajo del 50%, la cual esta presente todo el
tiempo. Los dgitos U1-U4 estarn activos segn la siguiente tabla:

;
;
;
;

U4
U3
U2
U1

=>
=>
=>
=>

dato
dato
dato
dato

en
en
en
en

reg
reg
reg
reg

U6,
U6,
U5,
U5,

AC_H
AC_H
AC_H
AC_H

=
=
=
=

0
1
0
1

(Q1
(Q2
(Q1
(Q2

activo)
activo)
activo)
activo)

; El circuito de la unidad de despliegue tiene un registro de


; corrimiento de 16 bits (2 MC14094) controlado por las seales
; DATA (RA1, U7-18), CLK (RA0, U7-17) y STB (RA2, U7-1).
; La unidad de despliegue es refrescada contnuamente en dos pasos:
; Primero los dgitos nones (U1,U3) y luego los dgitos pares (U2,U4)
; ------------------------------FUNCIN------------------------------; Existen tres modos de operacin del sistema:
; 1. Reloj digital de tiempo real (Hrs/Min) con alarma programable.
;
;
;
;
;
;
;

En este Modo la lmpara encender en tres colores de acuerdo al


siguiente criterio:
Rojo => Operando con la alarma deshabilitada (ALon=0)
mbar => Operando con la alarma habilitada (ALon=1), pero no
activada (relevador inactivo).
Verde => Operando con la alarma habilitada (ALon=1), y activada
(relevador activo).

; 2. Contador digital de cuatro dgitos.

386

;
;
;

En este modo, un tono (onda cuadrada) ser generado en el puerto


RB6 y la lmpara encender en color rojo por un breve tiempo
cada vez que suceda una de las siguientes acciones:

;
;
;

a. Cuando sea detectado un pulso (transicin de 1 a 0) en la


entrada del puerto RA4. Esta seal deber entrar al sistema
a travs del conector J2-3 (DIG_I).

;
;

b. Cuando sea prsesionado el botn PB3 (Previo), el cual sirve


para decrementar el contador en 1.

;
;

c. Cuando sea prsesionado el botn PB4 (Siguiente), el cual


sirve para incrementar el contador en 1.

; 3. Programar los siguientes parmetros involucrados en el sistema:


;
;
;
;
;

Tiempo del reloj (Hrs/Min) (TRLJ)


Tiempo de activacin de la alarma (activando el relevador)(TAON)
Tiempo de desactivacin de alarma (desactivando el relev.)(TAOF)
Deshabilitacin de la alarma (ALOF)
Habilitacin de la alarma (ALON)

; ------------------------------PARTE--------------------------------list p=16F84a
include "P16F84a.inc"
__config _WDT_ON & _PWRTE_ON & _XT_OSC & _CP_OFF
; -----------------------------VARIABLES-----------------------------; La memoria RAM de usuario (registros de propsito general)
; inicia en la localidad 0x0C y termina en la localidad 0x4F,
; por lo que tendremos un total de 68 registros disponibles.
RAM

equ

0x0C

; Inicio de la memoria
; RAM de usuario

;
;
;
;

Observe que utilizamos otra directiva: "equ" la cual nos


permite asignar, a un nombre de variable (RAM), una constante
definida a continuacin (0x0C). El resto son solo comentarios
iniciados por el caracter ";".

;
;
;
;

A continuacin definiremos los nombres de las variables que


utilizaremos en el programa y las que sern localizadas de
manera consecutiva y ascendente a partir del inicio definido
por RAM.

; Esto se indica al ensamblador mediante la directiva "cblock".


cblock

RAM

; Directiva

Counter
Int_count
CountMs
CountQs
CntMs_int

387

Count_10ms
temp_w
temp_stat
Dig_1
Dig_2
Dig_3
Dig_4
Digito
Push_count
Push_button
Flags
Control
Flag1
ftemp
c_seg_u
c_seg_d
c_min_u
c_min_d
c_hrs_u
c_hrs_d
c_aon_min_u
c_aon_min_d
c_aon_hrs_u
c_aon_hrs_d
c_aof_min_u
c_aof_min_d
c_aof_hrs_u
c_aof_hrs_d
c_rlj_min_u
c_rlj_min_d
c_rlj_hrs_u
c_rlj_hrs_d
cont_um
cont_c
cont_d
cont_u
temp
min_u
min_d
hrs_u
hrs_d
c_tono
c_tono_h
endc
;
;
;
;
;

; Directiva

Lo anterior implica que a la varible "Counter" se le asignar


la localidad 0x0C porque es el inicio del bloque de memoria,
a la variable "Int_count" se le asignar la loalidad 0x0D, y
as sucesivamente hasta la variable "c_tono_h" a la cual se le
asignar la localidad 0x3B.

w
f
False
True

equ
equ
equ
equ

.0
.1
.0
.1

; Bits pertenecientes al puerto PORTA

388

RA0
RA1
RA2

equ
equ
equ

.0
.1
.2

RA3

equ

.3

RA4

equ

.4

;
;
;
;
;
;
;
;

CLK (reloj para el registro de corrimiento)


DATA (dato para el registro de corrimiento)
STB (transfiere datos del registro de
corrimiento a su "latch" de salida).
AC_H (Activa transistores Q1 y Q2)
AC_H=0 => activa Q1 => U2,U4
AC_H=1 => activa Q2 => U1,U3
DIG_IN (entrada digital)

; Bits pertenecientes al puerto PORTB


RB0
RB1

equ
equ

.0
.1

RB2
RB3
RB4
RB5
RB6
RB7

equ
equ
equ
equ
equ
equ

.2
.3
.4
.5
.6
.7

;
;
;
;
;
;
;
;
;

L_verde (Led verde 0=off, 1=on)


L_rojo (Led rojo 0=off, 1=on)
L_mbar (Led rojo=1, Led_verde=1)
PB1 (0=push button oprimido)
PB2 (0=push button oprimido)
PB3 (0=push button oprimido)
PB4 (0=push button oprimido)
DIG_OUT (salida digital)
Relay (0=inactivo, 1=activo)

; Bits de control pertenecientes a la variable (Flags)


NONES
RFSH
RELAY
AL_ON
PT_RJ
PT_AON
PT_AOF

equ
equ
equ
equ
equ
equ
equ

.0
.1
.2
.3
.4
.5
.6

;
;
;
;
;
;
;

Refresca grupo (0=Pares,1=Nones)


Tiempo de refresco (0=No, 1=Si)
Relevador (0=inactivo, 1=activo)
Estado de la alarma (0=OFF, 1=ON)
Programando el tiempo de reloj
Programando el tiempo de Encendido de Alarma
Programando el tiempo de Apagado de Alarma

; Bits de control pertenecientes a la variable (Control)


RELOJ
CONTADOR
PROGRAMAR

equ
equ
equ

.0
.1
.2

; Funcin Reloj activa=1


; Funcin Contador activa=1
; Funcin Programar activa=1

; Bits de control pertenecientes a la variable (Push_button)


PB1
PB2
PB3
PB4

equ
equ
equ
equ

.0
.1
.2
.3

;
;
;
;

Estado
Estado
Estado
Estado

del
del
del
del

botn
botn
botn
botn

MODO (PB1)
ENTER (PB2)
PREVIO (PB4)
SIGUIENTE (PB3)

; Bits de control de uso general


bit0
bit1
bit2
bit3
bit4
bit5
bit6
bit7

equ
equ
equ
equ
equ
equ
equ
equ

.0
.1
.2
.3
.4
.5
.6
.7

Modo

equ

.1

; Funcin del push button PB1

389

Enter
Previo
Siguiente

equ
equ
equ

.2
.4
.8

; Funcin del push button PB2


; Funcin del push button PB3
; Funcin del push button PB4

; Smbolos de caracteres a desplegar (d7..d0) (g f e d c b a dp)


;
__a__
;
|
|
;
f
b
;
|
|
;
__g__
;
|
|
;
e
c
;
|
|
;
__d__
o dp
;
;
;
;
;
;

Considere en la siguiente tabla que 0=apagado, 1=encendido, y


posteriormente se invertir el estado de estos bits, ya que la
configuracin de la unidad de despliegue es de nodo comn y
recordemos que tendr que haber un estado bajo ("0") a la salida
del registro de corrimiento para que el segmento correspondiente
encienda.

; Por ejemplo, si desearamos desplegar el caracter "2", deberemos


; encender los segmentos: a, b, g, e, d. Es decir,
;
;
;
;
;
;

(g f e d c b a dp) (d7..d0)
1 0 1 1 0 1 1 0
=> 0xB6
(es el dato que aparece en la tabla)
y para ser desplegado se tendr que complementar (invertirse)
antes de ser enviado al registro de corrimiento para que en su
salida se presente un "0" en el segmento para que este encienda.
Es decir se tendr que enviar: 0 1 0 0 1 0 0 1 => 0x49.

; A continuacin se definen los valores de los diferentes smbolos


; para ser desplegados en la unidad de despliegue del sistema.
chr_blank
chr_dp
chr_0
chr_1
chr_2
chr_3
chr_4
chr_5
chr_6
chr_7
chr_8
chr_9
chr_perc
chr_A
chr_a
chr_b
chr_C
chr_c
chr_d
chr_E
chr_F
chr_G

equ
equ
equ
equ
equ
equ
equ
equ
equ
equ
equ
equ
equ
equ
equ
equ
equ
equ
equ
equ
equ
equ

0x00
0x01
0x7E
0x0C
0xB6
0x9E
0xCC
0xDA
0xFA
0x0E
0xFE
0xDE
0x0C
0xEE
0xBE
0xF8
0x0F
0xB0
0xBC
0xF2
0xE2
0xFA

;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;

' '
'.'
'0'
'1'
'2'
'3'
'4'
'5'
'6'
'7'
'8'
'9'
'%'
'A'
'a'
'B'
'C'
'c'
'd'
'E'
'F'
'G'

390

chr_g
equ
chr_H
equ
chr_h
equ
chr_I
equ
chr_i
equ
chr_J
equ
chr_K
equ
chr_L
equ
chr_l
equ
chr_M
equ
chr_n
equ
chr_
equ
chr_o
equ
chr_P
equ
chr_q
equ
chr_r
equ
chr_S
equ
chr_t
equ
chr_U
equ
chr_u
equ
chr_y
chr_Z
chr_deg
chr_minus
chr_sqparen_i
chr_sqparen_d
chr_unscore
chr_all

0xDE
0xEC
0xE8
0x0C
0x08
0x3C
0xE0
0x70
0x60
0x6E
0xA8
0xAA
0xB8
0xE6
0xCE
0xA0
0xDA
0xF0
0x7C
0x38
equ
equ
equ
equ
equ
equ
equ
equ

; 'g'
; 'H'
; 'h'
; 'I'
; 'i'
; 'J'
; 'K'
; 'L'
; 'l'
; 'M'
; 'n'
; ''
; 'o'
; 'P'
; 'q'
; 'r'
; 'S'
; 't'
; 'U'
; 'u'
0xDC
0xB6
0xC6
0x80
0x72
0x1E
0x10
0xFF

;
;
;
;
;
;
;
;

'y'
'Z'
''
'-'
'['
']'
'_'
'8.'

; -------------------------------CDIGO------------------------------;
;
;
;
;

En la localidad (0x00) se iniciar la ejecucin del programa de


aplicacin, o sea, desde el vector de arranque (Reset).
Las instrucciones se irn ejecutando secuencialmente, una en cada
ciclo de instruccin y nicamente se perder la secuencia cuando
exista una instruccin que modifique el contador de programa (PC) o

; exista una interrupcin. La directiva "org" del ensamblador indica


; la direccin de la memoria de programa donde se pondr el cdigo que
; le siga.
org

0x00

goto

start

; Vector de arranque (Reset)

; Esta es la primera instruccin del programa.


; Salta a la etiqueta "start"
; -------------------------------------------------------------------;
;
;
;

Esta localidad (0x04) corresponde al vector de interrupcin, es


decir, cuando sea generada una interrupcin, el control del programa
ser transferido a esta localidad desde donde se transferir el
control a la rutina de servicio a dicha interrupcin.
org

0x04

; Vector de Interrupcin

goto

int

; Salta a la etiqueta "int"

391

; -------------------------------------------------------------------; Inicio del programa principal


org

0x08

; Inicio del programa de aplicacin

start
;
;
;
;

En este momento todos los pines, tanto del puerto PORTA como del
puerto PORTB, son entradas digitales debido al arranque (Reset). Se
recomienda borrar los "latches" de salida de los puertos para
prevenir errores y ruido causados en el encendido.
clrf

PORTA

; PORTA=0
; Registro PORTA (05h) (d7 .. d0)
; - - - RA4 RA3 RA2 RA1 RA0

clrf

PORTB

; PORTB=0
; Registro PORTB (06h) (d7 .. d0)
; RB7 RB6 RB5 RB4 RB3 RB2 RB1 RB0

clrwdt

; Refresca temporizador de guardia (WDT)

; -------------- BANCO 1 -----------------------; Los siguientes registros se encuentran localizados en el Banco1 por
; lo que para tener acceso a ellos se deber direccionar el Banco1.
bsf

STATUS,RP0

; Direcciona el Banco1

; A partir de este momento estaremos trabajando con el Banco1.


; Las siguientes cuatro instrucciones configurarn los pines del
; puerto PORTA y del puerto PORTB. Recordemos que para seleccionar
; entrada=1 y para salida=0.
movlw B'11110000' ;
;
;
;
;
movwf TRISA
;
;
;
;
;
;
;
;
;
;
;
;

W=0xF0
Registro TRISA (85h) (d7 .. d0)
- - - RA4 RA3 RA2 RA1 RA0
(RA0,1,2,3 como salidas y RA4,5,6,7 como
entradas)
TRISA=W
RA0 = CLK (reloj para el registro de
corrimiento)
RA1 = DATA (dato para el registro de
corrimiento)
RA2 = STB (transfiere los datos del registro
de corrimiento a su correspondiente "latch" de salida).
RA3 = AC_H (Activa transistores Q1 y Q2)
AC_H=0 => activa Q1 => U2,U4
AC_H=1 => activa Q2 => U1,U3
RA4 = DIG_IN (entrada digital)

movlw B'00111100' ; W=0x3C


; Registro TRISB (86h) (d7 .. d0)

392

movwf TRISB

;
;
;
;
;
;

;
;
;
;

RB7 RB6 RB5 RB4 RB3 RB2 RB1 RB0


(RB2,3,4,5 como entradas, RB0,1,6,7 como
salidas)
TRISB=W

;
;
;
;
;
;
;
;
;

RB0 = L_verde (Led verde 0=off, 1=on)


RB1 = L_rojo (Led rojo 0=off, 1=on)
L_mbar (Led rojo=1, Led_verde=1)
RB2 = PB1 (0=push button oprimido)
RB3 = PB2 (0=push button oprimido)
RB4 = PB3 (0=push button oprimido)
RB5 = PB4 (0=push button oprimido)
RB6 = DIG_OUT (salida digital)
RB7 = Relay (0=inactivo, 1=activo)

A continuacin se seleccionar la fuente del reloj para el


temporizador TMR0, la cual ser tomada del reloj interno del ciclo
de instruccin. Asimismo, el incremento del contador se har con la
seal externa (DIG_I) sobre el pin RA4/T0CKI con transicin de altoa-bajo. Finalmente, el pre-escalador se asignar al temporizador
TMR0 y la relacin del pre-escalador ser de 1:4.
movlw B'11010001' ; Registro OPTION (81h) (d7 .. d0)
; RBPU INTEDG T0CS T0SE PSA PS2 PS1 PS0
; RBPU: Habilita resistencias "pull-up"
; 1 = Deshabilitadas
; 0 = Habilitadas (de manera individual)
; INTEDG: Flanco de interrupcin
; 1 = Interrupcin con el flanco de subida
;
sobre el pin RB0/INT
; 0 = Interrupcin con el flanco de bajada
;
sobre el pin RB0/INT
; T0CS: Bit de seleccin de la fuente de reloj
;
de TMR0
; 1 = Transicin sobre el pin RA4/T0CKI
; 0 = Reloj interno del ciclo de instruccin

(CLKOUT)
; T0SE: Bit de seleccin del flanco de la
;
fuente de TMR0
; 1 = Incrementa con transicin de alto-a-bajo
;
sobre el pin RA4/T0CKI
; 0 = Incrementa con transicin de bajo-a-alto
;
sobre el pin RA4/T0CKI
; PSA: Bit de asignacin del pre-escalador
; 1 = Pre-escalador asignado al temporizador
;
WDT
; 0 = Pre-escalador asignado al temporizador
;
TMR0
; PS<2:0>: Bits de seleccin de relacin del
;
pre-escalador
;
Bits
Relacin TMR0 Relacin WDT
;
000
1 : 2
1 : 1
;
001
1 : 4
1 : 2
;
010
1 : 8
1 : 4
;
011
1 : 16
1 : 8
;
100
1 : 32
1 : 16

393

;
;
;
movwf OPTION_REG

101
110
111

1 : 64
1 : 128
1 : 256

1 : 32
1 : 64
1 : 128

; OPTION_REG=W

; Los siguientes registros se encuentran localizados en el Banco0 por


; lo que para tener acceso a ellos se deber direccionar el Banco0.
bcf

STATUS,RP0

; Direcciona nuevamente el Banco0

; A partir de este momento estaremos trabajando con el Banco0.


; -------------- BANCO 0 -----------------------; Inicializa a cero las siguientes localidades de memoria RAM
clrf
clrf
clrf
clrf
clrf
clrf
clrf
clrf
clrf
clrf
clrf
clrf
clrf
clrf
clrf
clrf
clrf
clrf
clrf
clrf
clrf
clrf
clrf
clrf
clrf
clrf
clrf
clrf

Flags
Control
Flag1
Push_count
Push_button
Int_count
c_seg_u
c_seg_d
c_min_u
c_min_d
c_hrs_u
c_hrs_d
c_aon_min_u
c_aon_min_d
c_aon_hrs_u
c_aon_hrs_d
c_aof_min_u
c_aof_min_d
c_aof_hrs_u
c_aof_hrs_d
c_rlj_min_u
c_rlj_min_d
c_rlj_hrs_u
c_rlj_hrs_d
min_u
min_d
hrs_u
hrs_d

;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;

Apaga bits de control


Apaga bits de control
Apaga bits de control
Push_count=0
Push_button=0
Int_count=0
c_seg_u=0
c_seg_d=0
c_min_u=0
c_min_d=0
c_hrs_u=0
c_hrs_d=0
c_aon_min_u=0
c_aon_min_d=0
c_aon_hrs_u=0
c_aon_hrs_d=0
c_aof_min_u=0
c_aof_min_d=0
c_aof_hrs_u=0
c_aof_hrs_d=0
c_rlj_min_u=0
c_rlj_min_d=0
c_rlj_hrs_u=0
c_rlj_hrs_d=0
min_u=0
min_d=0
hrs_u=0
hrs_d=0

; Da la bienvenida desplegando todos los segmentos encendidos durante


; dos segundos de tiempo, lo cual sirve para verificar que todos los
; segmentos enciendan.
movlw chr_all

; W=0xFF (todos los segmentos encendidos)

call
call
call
call

;
;
;
;

rpt_dig
enb_int
Delay_100s
Delay_100s

El mismo dgito para Dig_1 a Dig_4


Habilita interrupciones
Retardo de aproximadamente 1 seg.
Retardo de aproximadamente 1 seg.

394

; Ahora, despliega todos los segmentos apagados durante un segundo de


; tiempo.
movlw chr_blank

; W=0 (todos los segmentos apagados)

call
call

; El mismo dgito para Dig_1 a Dig_4


; Retardo de aproximadamente 1 seg.

rpt_dig
Delay_100s

; Ahora despliega el mensaje "HOLA" y mantenlo visible hasta que el


; botn de MODO (PB1) sea oprimido.
movlw
movwf
movlw
movwf
movlw
movwf
movlw
movwf
;
;
;
;
;
;
;

chr_H
Dig_4
chr_0
Dig_3
chr_L
Dig_2
chr_A
Dig_1

; H
; O
; L
; A

Como podr observarse, bastar con escribir el dato a desplegar en


las variables Dig_4 a Dig_1, las cuales corresponden a los dgitos
U4 a U1 respectivamente. La rutina "refresca" ser la encargada de
enviar los datos correspondientes al registro de corrimiento para su
despliegue en forma dinmica. Esta accin es realizada con la ayuda
de la rutina de servicio a interrupcin.
--------------------------------------------------------------------

; Malla principal (Main Loop)


; A partir de aqu se ejecutarn una serie de acciones de manera
; cclica,ya que ser necesario estar observando si algn botn (PBx)
; es oprimido o alguna seal externa es recibida.
m_1
clrwdt

; Refresca temporizador de guardia (WDT) para


; que el microcontrolador no se reinicie
; (Reset).

call

refresca

; Refresca la unidad de despliegue


; (solo si fuese tiempo de)

call

Lee_PB

;
;
;
;
;

Lee el estado que guardan los botones


PB1=MODO
PB2=ENTER
PB3=PREVIO
PB4=SIGUIENTE

; Recordemos que la variable push_button=(0 0 0 0 PB4 PB3 PB2 PB1)


; (d7..d0)
; Verifca si la variable "Push_button" es diferente a cero, lo que
; implicar que algn botn fu oprimido.
movf

Push_button,w ; W=Push_button

; Probemos el bit Z del registro STATUS

395

; Si el bit Z del registro STATUS resultase ser "1", implicar que


; ningn botn fu oprimido.
btfsc STATUS,Z

; Si Z=0 entonces saltate la siguiente


; instruccin (goto m_1).

goto

; Si Z=1 regresa al inicio de la malla


; principal

m_1

; Aqui hemos llegado porque Z=0, es decir, el resultado diferente a


; cero lo cual implica que algn botn fu oprimido. Ahora se
; verificar cual fu el botn (PBx) oprimido.
;
;
;
;

El valor del botn oprimido fu guardado en la variable Push_button,


por lo que se comparar dicho valor, primero con el valor de PB1,
luego con el de PB2, y asi sucesivamente hasta saber cual botn fue
oprimido.
movf

Push_button,w ; W=Push_button

; Filtra el bit0 correspondiente a PB1


andlw Modo

; W=W . Modo
; MODO (PB1)

; Probemos el bit Z del registro STATUS


btfss STATUS,Z

; Si Z=1 entonces salta porque no fu PB1,


; de lo contrario (Z=0) ejecuta la prxima
; instruccin (goto m_modo)

goto

; El botn MODO fu oprimido

m_modo

; Aqui llegamos porque Z=1 (o sea, no fu PB1 el botn oprimido).


; Ahora vamos a realizar el mismo proceso pero comparando con PB2.
movf

Push_button,w ; W=Push_button

; Filtra el bit1 correspondiente a PB2


andlw Enter

; W=W . Enter
; ENTER (PB2)

; Probemos el bit Z del registro STATUS

;
;
;
;
;

btfss STATUS,Z

; Si Z=1 entonces salta porque no fu PB2,


; de lo contrario (Z=0) ejecuta la prxima
; instruccin (goto m_enter)

goto

; El botn de ENTER fu oprimido

m_enter

Aqui llegamos porque no fueron oprimidos ni PB1 ni PB2, pero como


estos son los nicos botones vlidos (es decir PB3 y PB4 son botones
invlidos) en esta parte del proceso, se considerar que no fu
oprimido ningn botn, por lo que regresaremos al inicio de la malla
principal.

396

goto m_1
; regresa al inicio de la malla principal
; -------------------------------------------------------------------; Aqui hemos llegado porque el botn MODO (PB1) fu oprimido.
; Cada vez que se oprima el botn MODO, la variable "Push_count" ser
; incrementada hasta llegar a su mximo valor, despus de lo cual se
; volver al inicio, es decir a cero y as repetidamente.
; Por otra parte, se presentar en la unidad de despliegue, el mensaje
; del modo en que se encuentra. De esta manera,
;

Push_count

;
;
;

0
1
2

MENSAJE
rLoJ
cont
Prog

MODO

Reloj de tiempo real


Contador
Programar

m_modo
; "Push_count" se procesar de 1 a 4 y no de 0 a 3 por lo que se
; incrementar (+1) antes del proceso.
incf

Push_count,f ; Push_count=Push_count+1

; Ahora, 1=Reloj, 2=Contador, 3=Programar, 4=Invlido


; Compara otros valores con Push_count
movf

Push_count,w ; W=Push_count

sublw .1

;
;
;
;

W=1-W (Modo RELOJ?)


Si Push_count=1 entonces Z=1, lo que
implicar que el men esta en la opcin de
Reloj

; Probemos el bit Z del registro STATUS


btfsc STATUS,Z

;
;
;
;

goto

; Si Z=1 entonces esta en modo Reloj.


; Ve a m_m_2 a desplegar modo RELOJ

m_m_2

Si Z=0 entonces salta la siguiente


instruccin (goto m_m_2) para seguir
comparando con otros valores de "Push_count"
porque no esta en la opcin de Reloj.

; Continuamos comparando otros valores con Push_count


movf

Push_count,w ; W=Push_count

sublw .2

;
;
;
;

W=2-W (Modo CONTADOR?)


Si Push_count=2 entonces Z=1, lo que
implicar que el men esta en la opcin de
Contador

397

; Probemos el bit Z del registro STATUS


btfsc STATUS,Z

;
;
;
;

goto

; Si Z=1 entonces esta en modo Contador.


; Ve a m_m_3 a desplegar modo CONTADOR

m_m_3

Si Z=0 entonces salta la siguiente


instruccin (goto m_m_3) para seguir
comparando con otros valores de "Push_count"
porque no esta en la opcin de Contador.

; Continuamos comparando otros valores con Push_count


movf

Push_count,w ; W=Push_count

sublw .3

;
;
;
;

W=3-W (Modo PROGRAMAR?)


Si Push_count=3 entonces Z=1, lo que
implicar que el men esta en la opcin de
Programar

; Probemos el bit Z del registro STATUS


btfsc STATUS,Z

;
;
;
;

goto

; Si Z=1 entonces esta en modo Programar.


; Ve a m_m_4 a desplegar modo PROGRAMAR

m_m_4

Si Z=0 entonces salta la siguiente


instruccin (goto m_m_4) para asignarle a
Push_count el valor correspondiente a modo
reloj (1).

; Si llegamos hasta aqui es porque el valor de "Push_count" esta fuera


; de rango por lo que se iniciar el contador Push_count en modo RELOJ
; -------------------------------------------------------------------; Despliega que el men esta en la opcin de modo RELOJ
m_m_1
movlw .1
movwf Push_count

; W=1
; Push_count=W

m_m_2
call disp_reloj ; Indica modo RELOJ
goto m_1x
; -------------------------------------------------------------------; Despliega que el men esta en la opcin de modo CONTADOR
m_m_3
call disp_contador ; Indica modo CONTADOR
goto m_1x
; -------------------------------------------------------------------; Despliega que el men esta por seleccionar el modo temporizador
m_m_4

398

call disp_programar ; Indica modo PROGRAMAR


; -------------------------------------------------------------------m_1x
; Espera a que dejen de oprimir el botn
call

ref_pb

; Ve a leer el estado que guardan los botones

; Recordemos que la variable push_button=(0 0 0 0 PB4 PB3 PB2 PB1)


; (d7..d0)
; Verifca si la variable "Push_button" es diferente a cero, lo que
; implicar que algn botn fu oprimido.
movf

Push_button,w ; W=Push_button

; Probemos el bit Z del registro STATUS


btfss STATUS,Z

; Si Z=1 implica que ningn botn se encuentra


; oprimido, entonces salta la siguiente
; instruccin (goto m_1x)

goto

m_1x

; Continua la espera en esta corta malla (loop)

call

Delay_25s

; Retardo de aproximadamente .25 seg.

goto m_1
; Salta al inicio de la malla principal
; -------------------------------------------------------------------m_enter
; Aqui llegamos porque el botn ENTER (PB2) fu oprimido.
; Cada vez que se oprima el botn ENTER, implicar que el usuario
; desea activar la funcin indicada por la variable "Push_count", la
; cual a su vez, es desplegada en ese momento.
;
;
;
;

Push_count

MENSAJE

FUNCIN

0
1
2

rLoJ
cont
Prog

movf

Push_count,w ; W=Push_count
; Push_count=1?

sublw .1

;
;
;
;

Reloj digital de tiempo real


Contador digital
Programar parmetros

W=1-W (Modo RELOJ?)


Si Push_count=1 entonces Z=1, lo que
implicar que el men esta en la opcin de
Reloj

; Probemos el bit Z del registro STATUS

399

btfsc STATUS,Z

;
;
;
;

goto

; ve a ejecutar la funcin de RELOJ

m_reloj

Si Z=0 entonces salta la siguiente


instruccin (goto m_reloj) para seguir
comparando con otros valores de "Push_count"
porque no esta en la opcin de Reloj.

; Continuamos comparando otros valores con Push_count


movf

Push_count,w ; W=Push_count
; Push_count=2?

sublw .2

;
;
;
;

W=2-W (Modo CONTADOR?)


Si Push_count=2 entonces Z=1, lo que
implicar que el men esta en la opcin de
Contador

; Probemos el bit Z del registro STATUS


btfsc STATUS,Z

;
;
;
;

goto

; ve a ejecutar la funcin de CONTADOR

m_contador

Si Z=0 entonces salta la siguiente


instruccin (goto m_contador) para seguir
comparando con otros valores de "Push_count"
porque no esta en la opcin de Contador.

; Continuamos comparando otros valores con Push_count


movf

Push_count,w ; W=Push_count
; Push_count=3?

sublw .3

;
;
;
;

W=3-W (Modo PROGRAMAR?)


Si Push_count=3 entonces Z=1, lo que
implicar que el men esta en la opcin de
Programar

; Probemos el bit Z del registro STATUS


btfsc STATUS,Z

; Si Z=0 entonces salta la siguiente


; instruccin (goto m_programar) para regresar
; al inicio de la malla principal.

goto

m_programar ; ve a ejecutar la funcin de PROGRAMAR

goto

m_1

; Como no fu ninguna de las opciones, regresa


; al inicio de la malla principal.
; -------------------------------------------------------------------; **************
; Funcin RELOJ
;
;
;
;
;

Esta funcin nos permite utilizar el sistema como un reloj digital


de tiempo real, el cual mostrar en la unidad de despliegue, la hora
(los dos dgitos de la izquierda) y los minutos (los dos dgitos de
la derecha), con un punto decimal entre las horas y los minutos. El
formato utilizado es el de 24 horas, es decir, de las 0.00 (12:00

400

;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;

am) a las 23.59 (11:59 pm).


Usando la funcin "Programar" se podr tener la facilidad de
programar el parmetro "TAon", correspondiente al tiempo (horas y
minutos) en el que se activar la alarma.
Asimismo, el parmetro "TAoF", correspondiente al tiempo (horas y
minutos) en el que se desactivar la alarma.
Tambin se podr habilitar o deshabilitar dicha alarma mediante los
parmetros "ALon" y "ALof" respectivamente.
Esta alarma activar el relevador de salida, permaneciendo activo
durante el tiempo programado en el parmetro "TAon". Una vez
transcurrido este tiempo, el relevador de salida ser desactivado y
el sistema seguir trabajando como un reloj hasta que nuevamente se
presente la hora de la activacin de la alarma. Cabe mencionar que
estando activo el relevador de salida, si se llegara a oprimir el
botn ENTER, el relevador de salida sera desactivado, y no se
activara hasta que nuevamente se detectara el tiempo de activacin
de la alarma (24 horas despus). Sin embargo la lmpara permanecer
en color verde hasta que se cumpla el tiempo programado para
desactivar la alrma.

m_reloj
call

modo_reloj

; ejecuta la funcin de RELOJ

goto m_1
; Regresa al inicio de la malla principal.
; -------------------------------------------------------------------; *****************
; Funcin CONTADOR
;
;
;
;
;
;
;
;

Esta funcin nos permite llevar un conteo de los pulsos externos


presentes en el pin "DIG_I" (J2-3). Cada transicin de alto-a-bajo
sobre este pin incrementar en uno el contador. Al iniciar la
ejecucin de esta funcin, el contador tendr un valor de 0000 y
ser presentado en la unidad de despliegue. El contador volver a su
estado inicial de 0000 en dos casos: al salir de la funcin CONTADOR
y volver a entrar en ella, o al oprimir el botn ENTER estando en la
funcin CONTADOR.

;
;
;
;
;
;
;

En esta funcin s se podrn usar los botones SIGUIENTE y PREVIO,


los cuales servirn para ajustar el contador en forma manual. De
esta manera, al oprimir el botn SIGUIENTE, el contador se
incrementar en uno, mientras que al oprimir el botn PREVIO, el
contador se decrementar en uno. Cabe mencionar que si se mantiene
oprimido cualquiera de estos dos botones, el contador cambiar con
mayor velocidad.

;
;
;
;
;
;
;

Por otra parte, cada vez que se incremente o decremente el contador,


se encender la lmpara roja por un instante breve de tiempo y se
volver a apagar. Asimismo,en ese mismo lapso breve de tiempo, ser
generada una seal de tono (una onda cuadrada), en el puerto RB6 el
cual es conectado a J2-2 a travs de una resistencia de 1K. Se
pretende que este tono sea una seal audible en el momento de la
ocurrencia del cambio del valor del contador.

m_contador
call

modo_contador ; ejecuta la funcin de CONTADOR

401

goto m_1
; Regresa al inicio de la malla principal.
; -------------------------------------------------------------------; ********************
; Funcin PROGRAMARR
; Esta funcin nos permite programar los parmetros del sistema tales
; como:
;
;
;
;
;

Tiempo del reloj: hh.mm


Tiempo de activacin de
Tiempo de desactivacin
El estado de la alarma:
("ALoF")

("trLJ")
la alarma : hh.mm ("tAon")
de la alarma: hh.mm ("tAoF")
Habilitada ("ALon") o Deshabilitada

; Entrando en esta funcin, las siguientes opciones se presentarn en


; la unidad de despliegue, cada vez que se oprima el botn SIGUIENTE
; (PB4) (+1):
;
;
;
;
;

"trLJ", "tAon", "tAoF", "ALoF" y "ALon".


Para seleccionar cualquiera de estos parmetros, primeramente
localicelo en la unidad de despliegue y luego oprima el botn ENTER
(PB2). Al hacer esto,y dependiendo el caso, en la unidad de
despliegue se presentar:

; Para el caso "trLJ" se presentar:


;
;
;
;
;
;
;

HH.MM indicando la hora y los minutos. Oprima el botn PREVIO (PB3)


para incrementar el contador de las horas (2 dgitos de la
izquierda). Oprima el botn SIGUIENTE (PB4) para incrementar el
contador de los minutos (2 dgitos de la derecha).
Ajuste la hora deseada y luego oprima el botn MODO (PB1) para
registrar el tiempo del reloj. Al hacer esto, la unidad de
despliegue presentar el men del nivel anterior, es decir, "trLJ".

; Para el caso "tAon" se presentar:


;
;
;
;
;
;
;
;

HH.MM indicando la hora y los minutos. Oprima el botn PREVIO (PB3)


para incrementar el contador de las horas (2 dgitos de la
izquierda). Oprima el botn SIGUIENTE (PB4) para incrementar el
contador de los minutos (2 dgitos de la derecha).
Ajuste la hora deseada y luego oprima el botn MODO (PB1) para
registrar el tiempo de la activacin de la alarma. Al hacer esto, la
unidad de despliegue presentar el men del nivel anterior, es
decir, "trLJ".

; Para el caso "tAof" se presentar:


;
;
;
;

HH.MM indicando la hora y los minutos. Oprima el botn PREVIO (PB3)


para incrementar el contador de las horas (2 dgitos de la
izquierda). Oprima el botn SIGUIENTE (PB4) para incrementar el
contador de los minutos (2 dgitos de la derecha).

; Ajuste la hora deseada y luego oprima el botn MODO (PB1) para

402

; registrar el tiempo de la desactivacin de la alarma. Al hacer esto,


; la unidad de despliegue presentar el men del nivel anterior, es
; decir, "trLJ".
; Para el caso "ALoF" se presentar:
;
;
;
;

El punto decimal del dgito U1 (el de la


opcin se encuentra activa, y apagado en
el botn ENTER (PB2), encender el punto
encontraba apagado y se apagar el punto

derecha) encendido, si esta


caso contrario. Oprimiendo
decimal si ste se
decimal si ste estaba

; encendido. Recuerde que el punto decimal encendido implica que la


; opcin se encuentra habilitada.
; Para el caso "ALon" se presentar:
;
;
;
;

El punto decimal del dgito U1 (el de la


opcin se encuentra activa, y apagado en
el botn ENTER (PB2), encender el punto
encontraba apagado y se apagar el punto

derecha) encendido, si esta


caso contrario. Oprimiendo
decimal si ste se
decimal si ste estaba

; encendido. Recuerde que el punto decimal encendido implica que la


; opcin se encuentra habilitada.
m_programar
call modo_programar ; ejecuta la funcin de PROGRAMAR
goto

m_m_1

; Regresa a desplegar modo reloj y luego


; a la malla (loop) principal.
; -------------------------------------------------------------------; ******************************************************
; Rutina que ejecuta la funcin de RELOJ
; ******************************************************
;
;
;
;

Esta rutina llevar la lectura de los botones de control y


actualizar cada minuto el tiempo en la unidad de despliegue. Se
asume que el contador de segundos (c_seg_d, c_seg_u) ser
actualizado en la rutina de servicio a interrupciones (int).

modo_reloj
mr_1
; Espera a que dejen de oprimir el botn, ya que el botn ENTER (PB2)
; hace que se apague el relevador,
call

ref_pb

; Ve a leer el estado que guardan los botones

; Recordemos que la variable push_button=(0 0 0 0 PB4 PB3 PB2 PB1)


; (d7..d0)
; Verifca si la variable "Push_button" es diferente a cero, lo que
; implicar que algn botn fu oprimido.
movf

Push_button,w ; W=Push_button

403

; Probemos el bit Z del registro STATUS


btfss STATUS,Z

; Si Z=1 implica que ningn botn se encuentra


; oprimido, entonces salta la siguiente
; instruccin (goto mr_1)

goto

; Continua la espera en esta corta malla (loop)

mr_1

; Pon el contador de segundos a cero, para su inicializacin.


clrf
clrf

c_seg_d
c_seg_u

; c_seg_d=0
; c_seg_u=0

call

lamp_red

; Asume que esta deshabilitada la alarma del


; reloj, por lo que se deber encender la
; lmpara roja.

btfsc Flags,AL_ON ;
;
;
;

Si AL_ON=0 (alarma de reloj deshabilitada),


entonces lo asumido es correcto y salta la
siguiente instruccin (call lamp_yellow)
para continuar la rutina.

; En caso contrario a lo asumido, enciende la lmpara amarilla.


call

lamp_yellow ; Enciende la lmpara amarilla que indica que


; el parmetro ALon est activo pero el
; relevador est desactivado.

; Inicializa contadores a partir de los correspondientes al tiempo del


; reloj previamente programado.
movf
movwf
movf
movwf
movf
movwf
movf
movwf

c_rlj_hrs_d,w
c_hrs_d
c_rlj_hrs_u,w
c_hrs_u
c_rlj_min_d,w
c_min_d
c_rlj_min_u,w
c_min_u

goto

rj_1

;
;
;
;
;
;
;
;

W=c_rlj_hrs_d
c_hrs_d=W
W=c_rlj_hrs_u
c_hrs_u=W
W=c_rlj_min_d
c_min_d=W
W=c_rlj_min_u
c_min_u=W

; Ve a escribir en la unidad de despliegue


; la hora previamente programada y regresa a
; m_r0.

; Inicio de la malla (loop)


m_r0
call

ref_pb

;
;
;
;

Esta rutina refrescar el temporizador de


guardia, refrescar la unidad de despliegue
si le corresponde y leer el estado que
guardan los botones (PBx).

; Recordemos que la variable push_button=(0 0 0 0 PB4 PB3 PB2 PB1)


; (d7..d0)
; Verifca si la variable "Push_button" es diferente a cero, lo que

404

; implicar que algn botn fu oprimido.


movf

Push_button,w ; W=Push_button

; Probemos el bit Z del registro STATUS

;
;
;
;
;

btfsc STATUS,Z

; Si Z=0 implica que algn botn se encuentra


; oprimido, entonces salta la siguiente
; instruccin (goto rj_0)

goto

; Si Z=1, ningn botn esta oprimido por lo que


; continua analizando los contadores de tiempo

rj_0

Si hemos llegado aqui es porque se detect algn botn oprimido. Los


nicos botonnes vlidos son el de MODO (PB1) y ENTER (PB2). El botn
MODO suspender la actividad en el modo reloj y regresar el control
al men principal en donde es seleccionada la funcion a ejecutar. El
botn ENTER desactivar el relevador de salida si este se encuentra

; activado. El valor del botn oprimido es guardado en la variable


; Push_button, por lo que se comparar dicho valor, con el valor de
; PB1.
movf

Push_button,w ; W=Push_button

; Filtra el bit0 correspondiente a PB1


andlw Modo

; W=W . Modo
; MODO (PB1)

; Probemos el bit Z del registro STATUS


btfss STATUS,Z

; Si Z=1 entonces salta porque no fu PB1,


; de lo contrario (Z=0) ejecuta la prxima
; instruccin (goto rj_x)

goto

; El botn MODO fu oprimido y por tanto


; termina la ejecucin de la funcin RELOJ.

rj_x

; Si llegamos aqui es porque no fu PB1 el botn oprimido.


; Comparemos con el botn ENTER (PB2)
movf

Push_button,w ; W=Push_button

; Filtra el bit0 correspondiente a PB1


andlw Enter

; W=W . Enter
; ENTER (PB2)

; Probemos el bit Z del registro STATUS


btfss STATUS,Z

; Si Z=1 entonces salta porque no fu PB2,


; de lo contrario (Z=0) ejecuta la prxima
; instruccin (call relay_off)

call

; El botn ENTER fu oprimido y por tanto


; desactiva (apaga) el relevador de salida

relay_off

405

;
;
;
;
;
;

y continua con el programa.


Note que la lmpara continuar en verde
indicando que el relevador est activo,
sin estarlo. La lmpara regresar a su
color mbar solo hasta que se cumpla el
tiempo programado para apagar la alarma.

; Aqui llegamos porque Z=1 (o sea, no fu PB1 el botn oprimido).


rj_0
;
;
;
;
;
;

Los contadores estan formados por dos bytes cada uno, los cuales
representan el dgito de las decenas y el dgito de las unidades.
Por ejemplo el contador de segundos estar representado por las
variables: c_seg_d, c_seg_u. Asimismo, el contador de minutos:
c_min_d, c_min_u, y finalmente el contador de horas: c_hrs_d,
c_hrs_u.

; Lee el contador de segundos y si resulta que es igual a 60, entonces


; incrementa el contador de minutos, poniendo el contador de segundos
; en cero. O sea, si el contador de segundos resulta ser 60
; (c_seg_d=6, c_seg_u=0) se necesitar actualizar la informacin de la
; unidad de despliegue.
movf

c_seg_d,w

sublw .6

; W=c_seg_d
; W=W-6
; Si el resultado de W=0 (es decir, Z=1),
; entonces el dgito de las decenas es 6.

; Probemos el bit Z del registro STATUS


btfss STATUS,Z

;
;
;
;
;
;

goto

; Por lo tanto, ve al inicio de la malla (loop)

m_r0

Si Z=1 entonces salta la siguiente


instruccin (goto m_r0) para seguir
actualizando los otros dgitos de la unidad
de despliegue. Si Z=0 finaliza el anlisis
porque no es necesario actualizar ms la
unidad de despliegue.

; Pon el contador de segundos a cero porque lleg a ser 60.


clrf
clrf

c_seg_d
c_seg_u

; c_seg_d=0
; c_seg_u=0

; Incrementa el contador de minutos, empezando por el dgito de las


; unidades.
incf

c_min_u,f

; c_min_u=c_min_u+1

; Si el dgito de las unidades es mayor a 9, se deber incrementar el


; dgito de las decenas y poner al dgito de las unidades en cero.
movf

c_min_u,w

; W=c_min_u

406

sublw .10

; W=W-10
; Si el resultado de W=0 (es decir, Z=1),
; entonces el dgito de las unidades es 10.

; Probemos el bit Z del registro STATUS


btfss STATUS,Z

;
;
;
;

Si Z=1 entonces salta la siguiente


instruccin (goto rj_1) para seguir
actualizando los otros dgitos de la unidad
de despliegue.

goto

;
;
;
;

Si Z=0 finaliza el anlisis porque no es


necesario actualizar ms la unidad de
despliegue. Ve a actualizar dgitos a
desplegar.

rj_1

; Hemos llegado aqui porque el resultado de la operacin anterior


; result ser 0,por lo tanto, pon al dgito de las unidades en cero.
clrf

c_min_u

; c_min_u=0

; Incrementa el dgito de las decenas


incf

c_min_d,f

; c_min_d=c_min_d+1

; Si el dgito de las decenas es mayor a 5, se deber incrementar el


; contador de las horas y poner al dgito de las decenas en cero.
movf

c_min_d,w

sublw .6

; W=c_min_d
; W=W-6
; Si el resultado de W=0 (es decir, Z=1),
; entonces el dgito de las decenas es 6.

; Probemos el bit Z del registro STATUS


btfss STATUS,Z

;
;
;
;

Si Z=1 entonces salta la siguiente


instruccin (goto rj_1) para seguir
actualizando los otros dgitos de la unidad
de despliegue.

goto

;
;
;
;

Si Z=0 finaliza el anlisis porque no es


necesario actualizar ms la unidad de
despliegue .Ve a actualizar dgitos
desplegar.

rj_1

; Hemos llegado aqui porque el resultado de la operacin anterior


; result ser 0,por lo tanto, pon al dgito de las decenas en cero.
clrf

c_min_d

; c_min_d=0

; Incrementa el contador de las horas, comenzando con el dgito de las


; unidades
incf

c_hrs_u,f

; c_hrs_u=c_hrs_u+1

; Si el dgito de las unidades es mayor a 3, se deber verificar que

407

; el dgito de las decenas no sea 2, ya que de serlo (>23 hrs) se


; debera poner el contador de las horas en cero (por cambio de da).
movf

c_hrs_u,w

sublw .4

; W=c_hrs_u
; W=W-4
; Si el resultado de W=0 (es decir, Z=1),
; entonces el dgito de las unidades es 4.

; Probemos el bit Z del registro STATUS


btfss STATUS,Z

;
;
;
;

goto

; Si Z=1, analiza si el dgito de las unidades


; es mayor que 9.

rj_2

Si Z=1 entonces salta la siguiente


instruccin (goto rj_2) para seguir
actualizando los otros dgitos de la unidad
de despliegue.

; Hemos llegado aqui porque el resultado de la operacin anterior


; result ser 4, por lo tanto, verifica que el dgito de las decenas
; no sea 2.
movf

c_hrs_d,w

sublw .2

; W=c_hrs_d
; W=W-2
; Si el resultado de W=0 (es decir, Z=1),
; entonces el dgito de las unidades es 2.

; Probemos el bit Z del registro STATUS


btfss STATUS,Z

;
;
;
;

Si Z=1 entonces salta la siguiente


instruccin (goto rj_1) para seguir
actualizando los otros dgitos de la unidad
de despliegue.

goto

;
;
;
;

Si Z=0 finaliza el anlisis porque no es


necesario actualizar ms la unidad de
despliegue. Ve a actualizar dgitos a
desplegar.

rj_1

; Hemos llegado aqui porque el resultado de la operacin anterior


; result ser 2,por lo tanto, borra el contador de las horas, es
; decir, hubo un cambio de da.
clrf

c_hrs_u

; c_hrs_u=0

clrf

c_hrs_d

; c_hrs_d=0

rj_3
; Actualiza informacin de la unidad de despliegue
rj_1
movf

c_min_u,w

; W=c_min_u

call

conv_chr

; Convierte el nmero contenido en el registro


; W a un caracter grfico (8 segmentos)
; desplegable.

408

; El resultado es depositado en el registro W.


movwf Dig_1

; Dig_1=W
; (En Dig_1 se encuentra el caracter a
; desplegar en el dgito U1 de la unidad de
; despliegue)

movf

c_min_d,w

; W=c_min_d

call

conv_chr

;
;
;
;

Convierte el nmero contenido en el registro


W a un caracter grfico (8 segmentos)
desplegable.
El resultado es depositado en el registro W.

movwf Dig_2

; Dig_2=W
; (En Dig_2 se encuentra el caracter a
; desplegar en el dgito U2 de la unidad de
; despliegue)

movf

c_hrs_u,w

; W=c_hrs_u

call

conv_chr

;
;
;
;

Convierte el nmero contenido en el registro


W a un caracter grfico (8 segmentos)
desplegable.
El resultado es depositado en el registro W.

iorlw .1

; W=W+1
; Enciende el punto decimal del Dig_3.

movwf Dig_3

; Dig_3=W
; (En Dig_3 se encuentra el caracter a
; desplegar en el dgito U3 de la unidad de
; despliegue)

movf

c_hrs_d,w

; W=c_hrs_d

call

conv_chr

;
;
;
;

movwf Dig_4

Convierte el nmero contenido en el registro


W a un caracter grfico (8 segmentos)
desplegable.
El resultado es depositado en el registro W.

; Dig_4=W
; (En Dig_4 se encuentra el caracter a
; desplegar en el dgito U4 de la unidad de
; despliegue)

; Verifica si es necesario comparar los contadores de la alarma.


btfss Flags,AL_ON ;
;
;
;
goto

m_r0

Si AL_ON=1, entonces salta la siguiente


instruccin (goto m_r0) y ve a
verificar si se encuentra activo el
relevador para ver si le toca ser apagado.

; Si AL_ON=0, implica que la alarma se


; encuentra desactivada y por lo tanto, ve al
; inicio de la malla (loop).

409

btfsc Flags,RELAY ;
;
;
;
;

Si RELAY=0 (relevador apagado), entonces


salta la siguiente instruccin (goto rj_4)
para comparar el tiempo de encendido de la
alarma y ver si es necesario activar el
relevador de salida.

goto

Si RELAY=1 (relevador encendido), entonces


ve a comparar el tiempo de apagado de la
alarma y ver si es necesario desactivar el
relevador de salida.

rj_4

;
;
;
;

; Etapa de activacin del relevador de salida ocacionado por la


; activacin de la alarma.
; Compara el tiempo actual del reloj con el tiempo programado para la
; alarma.
movf

c_hrs_d,w

; W=c_hrs_d (tiempo actual del reloj)

subwf c_aon_hrs_d,w ;
;
;
;

W=c_aon_hrs_d-W
Si el resultado es W=0, entonces Z=1, lo
que implicar que ambos valores son
iguales.

; Probemos el bit Z del registro STATUS


btfss STATUS,Z

;
;
;
;

Si Z=1 entonces salta la siguiente


instruccin (goto m_r0) para seguir
comparando los otros dgitos de la unidad de
despliegue.

goto

m_r0

; Si Z=0, ve al inicio de la malla (loop)

movf

c_hrs_u,w

; W=c_hrs_u (tiempo actual del reloj)

subwf c_aon_hrs_u,w ;
;
;
;

W=c_aon_hrs_u-W
Si el resultado es W=0, entonces Z=1, lo
que implicar que ambos valores son
iguales.

; Probemos el bit Z del registro STATUS


btfss STATUS,Z

;
;
;
;

Si Z=1 entonces salta la siguiente


instruccin (goto m_r0) para seguir
comparando los otros dgitos de la unidad de
despliegue.

goto

m_r0

; Si Z=0, ve al inicio de la malla (loop)

movf

c_min_d,w

; W=c_min_d (tiempo actual del reloj)

subwf c_aon_min_d,w ;
;
;
;

W=c_aon_min_d-W
Si el resultado es W=0, entonces Z=1, lo
que implicar que ambos valores son
iguales.

410

; Probemos el bit Z del registro STATUS


btfss STATUS,Z

;
;
;
;

Si Z=1 entonces salta la siguiente


instruccin (goto m_r0) para seguir
comparando los otros dgitos de la unidad de
despliegue.

goto

m_r0

; Si Z=0, ve al inicio de la malla (loop)

movf

c_min_u,w

; W=c_min_u (tiempo actual del reloj)

subwf c_aon_min_u,w ;
;
;
;

W=c_aon_min_u-W
Si el resultado es W=0, entonces Z=1, lo
que implicar que ambos valores son
iguales.

; Probemos el bit Z del registro STATUS


btfss STATUS,Z

;
;
;
;

goto

; Por lo tanto, ve al inicio de la malla (loop)

m_r0

Si Z=1 entonces salta la siguiente


instruccin (goto m_r0) para seguir
comparando los otros dgitos de la unidad de
despliegue.

; Hemos llegado aqui porque el tiempo de la alarma es igual al tiempo


; actual, por lo que deber activarse la alarma, o sea, activar el
; relevador de salida.
btfss Flags,AL_ON ;
;
;
;

Si AL_ON=1 (alarma de reloj habilitada),


entonces salta la siguiente instruccin (goto
m_r1) ve a encender la lmpara verde y
regresa al inicio de la malla (loop).

goto

m_r1

; Si AL_ON=0 (alarma de reloj deshabilitada),


; entonces ve a encender la lmpara roja

call
call

relay_on
lamp_green

;
;
;
;

bsf

Flags,RELAY ; RELAY=1 (relevador de salida activo).

Activa relevador de salida


Enciende la lmpara verde que indica que
la alarma del reloj est habilitada y el
relevador se encuentra activo.

; Continua estando en el modo RELOJ


goto

m_r0

; Ve al inicio de la malla (loop)

; Aqui llegamos porque el parmetro AL_ON=0, lo que implica que no se


; encuentra habilitada la alarma del reloj.
m_r1
call

lamp_red

; Enciende la lmpara roja que indica que la


; alarma del reloj est deshabilitada (ALon=0)
; y el relevador se encuentra inactivo tambin.

goto

m_r0

; Ve al inicio de la malla (loop)

411

; -------------------------------------------------------------------; Hemos llegado aqui porque el resultado de la operacin anterior


; result no ser 4, por lo tanto, analiza si el contador de las
; unidades es mayor que 9.
rj_2
movf

c_hrs_u,w

sublw .10

; W=c_hrs_u
; W=W-10
; Si el resultado de W=0 (es decir, Z=1),
; entonces el dgito de las unidades es 10.

; Probemos el bit Z del registro STATUS


btfss STATUS,Z

;
;
;
;

Si Z=1 entonces salta la siguiente


instruccin (goto rj_1) para seguir
actualizando los otros dgitos de la unidad
de despliegue.

goto

;
;
;
;

Si Z=0 finaliza el anlisis porque no es


necesario actualizar ms la unidad de
despliegue. Ve a actualizar dgitos a
desplegar.

rj_1

; Hemos llegado aqui porque el resultado de la operacin anterior


; result ser 0,por lo tanto, pon al dgito de las unidades en cero.
clrf

c_hrs_u

; c_hrs_u=0

; Incrementa el dgito de las decenas


incf

c_hrs_d,f

; c_hrs_d=c_hrs_d+1

; Si el dgito de las decenas es mayor a 2 se debera poner el contador


; de las horas en cero (por cambio de da).
movf

c_hrs_d,w

sublw .3

; W=c_hrs_d
; W=W-3
; Si el resultado de W=0 (es decir, Z=1),
; entonces el dgito de las decenas es 3.

; Probemos el bit Z del registro STATUS


btfsc STATUS,Z

; Si Z=0 entonces salta la siguiente


; instruccin (goto rj_3) para continuar la
; malla (loop)

goto

rj_3

; Si Z=1, ve hacer 0 el digito de las decenas.

goto

rj_1

; Si Z=0, ve a actualizar dgitos a desplegar.

; Hemos llegado aqui porque la alarma se encuentra activa (AL_ON=1) y


; el relevador de salida tambin se encuentra activo (RELAY=1).

412

; Etapa de desactivacin del relevador de salida ocacionado por la


; deteccin del tiempo de apagado de la alarma.
rj_4
; Compara el tiempo actual del reloj con el tiempo programado para la
; alarma.
movf

c_hrs_d,w

; W=c_hrs_d (tiempo actual del reloj)

subwf c_aof_hrs_d,w ;
;
;
;

W=c_aof_hrs_d-W
Si el resultado es W=0, entonces Z=1, lo
que implicar que ambos valores son
iguales.

; Probemos el bit Z del registro STATUS


btfss STATUS,Z

;
;
;
;

Si Z=1 entonces salta la siguiente


(goto m_r0) para seguir comparando los
instruccin otros dgitos de la unidad de
despliegue.

goto

m_r0

; Si Z=0, ve al inicio de la malla (loop)

movf

c_hrs_u,w

; W=c_hrs_u (tiempo actual del reloj)

subwf c_aof_hrs_u,w ;
;
;
;

W=c_aof_hrs_u-W
Si el resultado es W=0, entonces Z=1, lo
que implicar que ambos valores son
iguales.

; Probemos el bit Z del registro STATUS


btfss STATUS,Z

;
;
;
;

Si Z=1 entonces salta la siguiente


instruccin (goto m_r0) para seguir
comparando los otros dgitos de la unidad de
despliegue.

goto

m_r0

; Si Z=0, ve al inicio de la malla (loop)

movf

c_min_d,w

; W=c_min_d (tiempo actual del reloj)

subwf c_aof_min_d,w ;
;
;
;

W=c_aof_min_d-W
Si el resultado es W=0, entonces Z=1, lo
que implicar que ambos valores son
iguales.

; Probemos el bit Z del registro STATUS


btfss STATUS,Z

;
;
;
;

goto

; Si Z=0, ve al inicio de la malla (loop)

m_r0

Si Z=1 entonces salta la siguiente


instruccin (goto m_r0) para seguir
comparando los otros dgitos de la unidad de
despliegue.

413

movf

c_min_u,w

; W=c_min_u (tiempo actual del reloj)

subwf c_aof_min_u,w ;
;
;
;

W=c_aof_min_u-W
Si el resultado es W=0, entonces Z=1, lo
que implicar que ambos valores son
iguales.

; Probemos el bit Z del registro STATUS


btfss STATUS,Z

;
;
;
;

goto

; Si Z=0, ve al inicio de la malla (loop)

m_r0

Si Z=1 entonces salta la siguiente


instruccin (goto m_r0) para seguir
comparando los otros dgitos de la unidad de
despliegue.

; Hemos llegado aqui porque el tiempo de apagado de la alarma es igual


; al tiempo actual, por lo que deber desactivarse el relevador de
; salida.
call
call

relay_off
; Desctiva relevador de salida
lamp_yellow ; Enciende la lmpara amarilla que indica que
; el parmetro ALon est activo pero el
; relevador est desactivado.

bcf

Flags,RELAY ; RELAY=0,

(relevador de salida inactivo).

; Continua estando en el modo RELOJ


goto

m_r0

; Si Z=0, ve al inicio de la malla (loop)

; Hemos llegado aqui porque se oprimi el botn de MODO, y deber


; abandonarse este modo de funcionamiento (RELOJ).
rj_x
call
call

relay_off
lamp_off

; Desctiva relevador de salida


; Apaga lmpara, porque estamos saliendo del
; modo reloj.

bcf

Flags,RELAY ; RELAY=0,(relevador de salida inactivo).

return
; Regreso de subrutina
; -------------------------------------------------------------------; ******************************************************
; Rutina que ejecuta la funcin de CONTADOR
; ******************************************************
;
;
;
;
;

Esta rutina llevar la lectura de los botones de control, el


refresco de la unidad de despliegue y actualizar el contador, cada
vez que se registre un pulso en la entrada "DIG_IN" (J2-3) conectada
al bit RA4 del puerto PORTA o los botones PREVIO (PB3) y SIGUIENTE
(PB4) sean oprimidos.

modo_contador

414

; Al entrar en este modo se debr inicializar el contador a cero


; (0000), lo cual es realizado en la tarea localizada en la etiqueta
; ct_enter_c y luego regresar a m_c0.
goto

ct_enter_c

call

ref_pb

m_c0
;
;
;
;

Esta rutina refrescar el temporizador de


guardia, refrescar la unidad de despliegue
si le corresponde y leer el estado que
guardan los botones (PBx).

; Recordemos que la variable push_button=(0 0 0 0 PB4 PB3 PB2 PB1)


; (d7..d0)
; Verifca si la variable "Push_button" es diferente a cero, lo que
; implicar que algn botn fu oprimido.
movf

Push_button,w ; W=Push_button

; Probemos el bit Z del registro STATUS


btfsc STATUS,Z

; Si Z=0 implica que algn botn se encuentra


; oprimido, entonces salta la siguiente
; instruccin (goto ct_0_c)

goto

; Si Z=1, continua en modo contador, analizando


; la entrada digital externa (DIG_IN).

ct_0_c

; Si hemos llegado aqui es porque se detect algn botn oprimido.


; Ahora se verificar cual fu el botn (PBx) oprimido.
;
;
;
;

El valor del botn oprimido fu guardado en la variable Push_button,


por lo que se comparar dicho valor, primero con el valor de PB1,
luego con el de PB2, y asi sucesivamente hasta saber cual botn fue
oprimido.
movf

Push_button,w ; W=Push_button

; Filtra el bit0 correspondiente a PB1


andlw Modo

; W=W . Modo
; MODO (PB1)

; Probemos el bit Z del registro STATUS


btfss STATUS,Z

; Si Z=1 entonces salta porque no fu PB1,


; de lo contrario (Z=0) ejecuta la prxima
; instruccin (goto ct_x_c)

goto

; Si Z=0 el botn MODO fu oprimido

ct_x_c

; Aqui llegamos porque Z=1 (o sea, no fu PB1 el botn oprimido).


; Ahora vamos a realizar el mismo proceso pero comparando con PB2.
movf

Push_button,w ; W=Push_button

415

; Filtra el bit1 correspondiente a PB2


andlw Enter

; W=W . Enter
; ENTER (PB2)

; Probemos el bit Z del registro STATUS


btfss STATUS,Z

; Si Z=1 entonces salta porque no fu PB2,


; de lo contrario (Z=0) ejecuta la prxima
; instruccin (goto ct_enter_c)

goto

; Si Z=0 el botn ENTER fu oprimido

ct_enter_c

; Aqui llegamos porque Z=1 (o sea, no fu PB2 el botn oprimido).


; Ahora vamos a realizar el mismo proceso pero comparando con PB4.
movf

Push_button,w ; W=Push_button

; Filtra el bit2 correspondiente a PB3


andlw Siguiente

; W=W . Siguiente
; SIGUIENTE (PB4)

; Probemos el bit Z del registro STATUS


btfss STATUS,Z

; Si Z=1 entonces salta porque no fu PB3,


; de lo contrario (Z=0) ejecuta la prxima
; instruccin (goto ct_sig_c)

goto

; Si Z=0 el botn SIGUIENTE fu oprimido

ct_sig_c

; Aqui llegamos porque Z=1 (o sea, no fu PB4 el botn oprimido).


; Por lo tanto, la nica posibilidad es que fu PB3.
; El botn PREVIO fu oprimido, por lo que se decrementar el
; contador.
ct_prev_c
decf

cont_u,f

; cont_u=cont_u-1

movf

cont_u,w

; W=cont_u

sublw 0xFF

; W=0xFF-W
; Si Z=1 implicar que cont_u=-1 )(o sea, 0xFF)

btfss STATUS,Z

; Si Z=1 entonces salta la siguiente


; instruccin (goto ct_3_c) porque hay que
; ajustar el contador de eventos.

goto

; Si Z=0 no ser necesario ajustar el contador.

ct_3_c

; Aqui hemos llegado porque cont_u=0xFF (-1), lo que implica que


; deber hacerse count_u=9 y decrementar cont_d.
movlw .9
movwf cont_u

; W=9
; cont_u=W

416

decf

cont_d,f

; cont_d=cont_d-1

movf

cont_d,w

; W=cont_d

sublw 0xFF

; W=0xFF-W
; Si Z=1 implicar que cont_d=-1

btfss STATUS,Z

; Si Z=1 entonces salta la siguiente


; instruccin (goto ct_3_c) porque hay que
; ajustar el contador de eventos.

goto

; Si Z=0 no ser necesario ajustar el contador.

ct_3_c

; Aqui hemos llegado porque cont_d=0xFF (-1), lo que implica que


; deber hacerse count_d=9 y decrementarse cont_c.
movlw .9
movwf cont_d

; W=9
; cont_d=W

decf cont_c,f
movf cont_c,w
sublw 0xFF

;
;
;
;

btfss STATUS,Z

; Si Z=1 entonces salta la siguiente


; instruccin (goto ct_3_c) porque hay que
; ajustar el contador de eventos.

goto

; Si Z=0 no ser necesario ajustar el contador.

ct_3_c

cont_c=cont_c-1
W=cont_c
W=0xFF-W
Si Z=1 implicar que cont_c=-1

; Aqui hemos llegado porque cont_c=0xFF (-1), lo que implica que


; deber hacerse count_c=9 y decrementarse cont_um.
movlw .9
movwf cont_c

; W=9
; cont_c=W

decf

cont_um,f

; cont_um=cont_um-1

movf

cont_um,w

; W=cont_um

sublw 0xFF

; W=0xFF-W
; Si Z=1 implicar que cont_um=-1

btfss STATUS,Z

; Si Z=1 entonces salta la siguiente


; instruccin (goto ct_3_c) porque hay que
; ajustar el contador de eventos.

goto

; Si Z=0 no ser necesario ajustar el contador.

ct_3_c

; Aqui hemos llegado porque cont_um=0xFF (-1), lo que implica que


; deber hacerse count_um=9.
movlw .9
movwf cont_um

; W=9
; cont_um=W

417

goto

ct_3_c

; Ve al final de la rutina para ir posterior; mente al inicio de la malla (loop).

; Si el botn ENTER fu oprimido, se iniciar el contador a cero.


ct_enter_c
clrf
clrf
clrf
clrf
goto

cont_um
cont_c
cont_d
cont_u

;
;
;
;

cont_um=0
cont_c=0
cont_d=0
cont_u=0

ct_3_c

; Ve al final de la rutina para ir posterior; mente al inicio de la malla (loop).

; Si el botn SIGUIENTE fu oprimido, se incrementar el contador.


ct_sig_c
goto

;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;

ct_2_c

; Ve a incrementar el contador de eventos.


; La funcin es similar a la de detectar
; un pulso en la entrada digital RA4.

El contador esta formado por cuatro bytes, los cuales representan:


el dgito de las unidades de millar (cont_um), el dgito de las
centenas (cont_c), el dgito de las decenas (cont_d) y el dgito de
las unidades (cont_u).
Continuamente se leer la entrada digital del bit RA4 (PORTA)
proveniente del conector externo (J2-3) y cuando sea detectado un
pulso (transicin de 1 a 0), se incrementar el contador de eventos.
Es decir, se incrementar la variable "cont_u". Cuando cont_u sea
mayor que 9, se borrar a cero y se incrementar la variable
"cont_d". Cuando cont_d sea mayor que 9, se borrar a cero y se
incrementar la variable "cont_c". Cuando cont_c sea mayor que 9, se
borrar a cero y se incrementar la variable "cont_um". Cuando
cont_um sea mayor que 9, se borrar a cero.
Si el botn SIGUIENTE o PREVIO permanecieran oprimidos, el
incremento o decremento del contador se har con mayor velocidad.
La siguiente malla (loop) leer el bit de entrada digital RA4, el
cual estar en su estado de reposo alto ("1"). Cuando esta seal
cambie de "1" a "0" se registrar un evento y el contador ser
incrementado.

; Realiza 10 intentos de lectura del puerto y en el momento de


; detectar un pulso, abandona la malla (loop)
ct_0_c
movlw .10
movwf Counter
ct_1_c
btfss PORTA,RA4

goto

ct_2_c

; W=10
; Counter=W
;
;
;
;

Si RA4=1 entonces salta la siguiente


instruccin (goto ct_2_c), lo que implica
que un pulso NO ha sido detectado en la
entrada digital RA4.

; Si RA=0 implica que se ha detectado un pulso

418

; en la entrada digital RA4.


; Aqui hemos llegado porque RA=1, lo que implica que un pulso NO ha
; sido detectado, por lo que verifica si se requiere hacer otra
; lectura nuevamente.
Decfsz Counter,f

; Counter=Counter-1 y salta la siguiente


; instruccin (goto ct_1_c) si el resultado es
; 0.

goto

ct_1_c

; continua la lectura del bit RA4 (PORTA)

goto

m_c0

; Aqui hemos llegado porque RA4=0, lo que implica que un pulso ha sido
; detectado.Por lo tanto, se actualizar el contador de eventos.
ct_2_c
incf

cont_u,f

; cont_u=cont_u+1

movf

cont_u,w

; W=cont_u

sublw .10

; W=10-W
; Si Z=1 implicar que cont_u=10

btfss STATUS,Z

; Si Z=1 entonces salta la siguiente


; instruccin (goto ct_3_c) porque hay que
; ajustar el contador de eventos.

goto

; Si Z=0 no ser necesario ajustar el contador.

ct_3_c

; Aqui hemos llegado porque count_u=10, lo que implica que se deber


; incrementar count_d y hacer count_u=0.
clrf

cont_u

; cont_u=0

incf

cont_d,f

; cont_d=cont_d+1

movf

cont_d,w

; W=cont_d

sublw .10

; W=10-W
; Si Z=1 implicar que cont_d=10

btfss STATUS,Z

; Si Z=1 entonces salta la siguiente


; instruccin (goto ct_3_c) porque hay que
; ajustar el contador de eventos.

goto

; Si Z=0 no ser necesario ajustar el contador.

ct_3_c

; Aqui hemos llegado porque count_d=10, lo que implica que se deber


; incrementar count_c y hacer count_d=0.
clrf

cont_d

; cont_d=0

incf

cont_c,f

; cont_c=cont_c+1

movf

cont_c,w

; W=cont_c

419

sublw .10

; W=10-W
; Si Z=1 implicar que cont_c=10

btfss STATUS,Z

; Si Z=1 entonces salta la siguiente


; instruccin (goto ct_3_c) porque hay que
; ajustar el contador de eventos.

goto

; Si Z=0 no ser necesario ajustar el contador.

ct_3_c

; Aqui hemos llegado porque count_c=10, lo que implica que se deber


incrementar
; count_um y hacer count_c=0.
clrf

cont_c

; cont_c=0

incf

cont_um,f

; cont_um=cont_um+1

movf

cont_um,w

; W=cont_um

sublw .10

; W=10-W
; Si Z=1 implicar que cont_um=10

btfss STATUS,Z

; Si Z=1 entonces salta la siguiente


; instruccin (goto ct_3_c) porque hay que
; ajustar el contador de eventos.

goto

; Si Z=0 no ser necesario ajustar el contador.

ct_3_c

; Aqui hemos llegado porque count_um=10, lo que implica que se deber


; hacer count_um=0.
clrf
ct_3_c

cont_um

; cont_um=0

; Actualiza la informacin de la unidad de despliegue.


movf

cont_um,w

; W=cont_um

call

conv_chr

; Convierte dato a caracter desplegable

movwf Dig_4

; Dig_4=W

movf

cont_c,w

; W=cont_c

call

conv_chr

; Convierte dato a caracter desplegable

movwf Dig_3

; Dig_3=W

movf

cont_d,w

; W=cont_d

call

conv_chr

; Convierte dato a caracter desplegable

movwf Dig_2

; Dig_2=W

movf

; W=cont_u

cont_u,w

420

call

conv_chr

; Convierte dato a caracter desplegable

movwf Dig_1

; Dig_1=W

call
call

lamp_red
Gen_tono

call

lamp_off

;
;
;
;

goto

m_c0

; Ve al inicio de la malla (loop)

Enciende la lmpara roja por unos momentos.


Genera un tono de salida de 3KHz por
aproxiadamente 0.5 seg.
Apaga la lmpara.

; Si el botn MODO fu oprimido, se suspender la actividad del modo


; contador y regresar al men principal en donde la funcion a
; ejecutar es seleccionada.
ct_x_c
return
; Regreso de subrutina
; -------------------------------------------------------------------; ******************************************************
; Rutina que ejecuta la funcin de PROGRAMAR
; ******************************************************
; Esta rutina permitir la programacin de los siguientes parmetros
; usados en el sistema:
; "trLJ", "tAon", "tAoF", "ALoF" y "ALon".
modo_programar
clrf

Push_count

; Push_count=0

goto

mp_sig

; Despliega la primera opcin (trLJ) y regresa


; al inicio de la malla (loop) en m_p0

m_p0
clrwdt

; Refresca temporizador de guardia (WDT)

call

refresca

; Refresca la unidad de despliegue


; (solo si fuese tiempo de)

call

Lee_PB

;
;
;
;
;

Lee el estado que guardan los botones


PB1=MODO
PB2=ENTER
PB3=SIGUIENTE
PB4=PREVIO

; Recordemos que la variable push_button=(0 0 0 0 PB4 PB3 PB2 PB1)


; (d7..d0)
; Verifca si la variable "Push_button" es diferente a cero, lo que
; implicar que algn botn fu oprimido.
movf

Push_button,w ; W=Push_button

; Probemos el bit Z del registro STATUS

421

; Si el bit Z del registro STATUS resultase ser "1", implicar que


; ningn botn fu oprimido.
btfsc STATUS,Z

; Si Z=0 entonces saltate la siguiente


; instruccin (goto m_p0).

goto

; Si Z=1 regresa al inicio de la malla


; principal

m_p0

; Aqui hemos llegado porque Z=0, lo cual implica que algn botn fu
; oprimido. Ahora se verificar cual fu el botn (PBx) oprimido.
;
;
;
;

El valor del botn oprimido fu guardado en la variable Push_button,


por lo que se comparar dicho valor, primero con el valor de PB1,
luego con el de PB2, y finalmente con el de PB4, hasta saber cual
botn fu oprimido.
movf

Push_button,w ; W=Push_button

; Filtra el bit0 correspondiente a PB1


andlw Modo

; W=W . Modo
; MODO (PB1)

; Probemos el bit Z del registro STATUS


btfss STATUS,Z

; Si Z=1 entonces salta porque no fu PB1,


; de lo contrario (Z=0) ejecuta la prxima
; instruccin (goto mp_2x)

goto

; El botn MODO fu oprimido


; regresa al men principal

mp_2x

; Aqui llegamos porque Z=1 (o sea, no fu PB1 el botn oprimido).


; Ahora vamos a realizar el mismo proceso pero comparando con PB2.
movf

Push_button,w ; W=Push_button

; Filtra el bit1 correspondiente a PB2


andlw Enter

; W=W . Enter
; ENTER (PB2)

; Probemos el bit Z del registro STATUS


btfss STATUS,Z

; Si Z=1 entonces salta porque no fu PB2,


; de lo contrario (Z=0) ejecuta la prxima
; instruccin (goto mp_enter)

goto

; El botn ENTER fu oprimido

mp_enter

; Aqui llegamos porque Z=1 (o sea, no fu PB2 el botn oprimido).


; Ahora vamos a realizar el mismo proceso pero comparando con PB4 que
; es la ltima opcin.
movf

Push_button,w ; W=Push_button

422

; Filtra el bit3 correspondiente a PB4


andlw Siguiente

; W=W . Siguiente
; SIGUIENTE (PB4)

; Probemos el bit Z del registro STATUS

;
;
;
;
;

btfss STATUS,Z

; Si Z=1 entonces salta porque no fu PB4,


; de lo contrario (Z=0) ejecuta la prxima
; instruccin (goto mp_sig)

goto

; El botn de SIGUIENTE fu oprimido

mp_sig

Aqui llegamos porque no fueron oprimidos ni PB1, PB2 ni PB4, pero


como estos son los nicos botones vlidos (es decir PB3 es un botn
invlido) en esta parte del proceso, se considerar que no fu
oprimido ningn botn, por lo que regresaremos al inicio de la malla
(loop).

goto m_p0
; regresa al inicio de la malla (loop)
; -------------------------------------------------------------------;
;
;
;
;
;
;
;
;
;
;
;
;

Cada vez que se oprima el botn SIGUIENTE, la variable "Push_count"


ser incrementada hasta llegar a su mximo valor, despus de lo cual
se volver al inicio, es decir a cero y as repetidamente.
Por otra parte, se presentar en la unidad de despliegue, el mensaje
del parmetro a programar en que se encuentra. De esta manera,
Push_count

MENSAJE

0
1

trLJ
tAon

tAoF

3
4

ALoF
ALon

MODO
Tiempo del Reloj (hh:mm)
Tiempo de encendido de la alarma
(hh:mm)
Tiempo de apagado de la alarma
(hh:mm)
Deshabilita alarma
Habilita alarma

; "Push_count" se procesar de 1 a 5 y no de 0 a 4 por lo que se


; incrementar (+1) antes del proceso.
mp_sig
incf

Push_count,f ; Push_count=Push_count+1

; Pregunta si es el nmero invlido


movf

Push_count,w ; W=Push_count

sublw .6

;
;
;
;
;

W=6-W (fuera de rango?)


Si Push_count=6 entonces Z=1, lo que
implica que est fuera de rango por lo que
deber desplegarse la tarea del inicio
de la lista, es decir, "trLJ"

; Probemos el bit Z del registro STATUS

423

btfsc STATUS,Z

;
;
;
;

goto

; Si Z=1 entonces esta fuera de rango.


; ve a desplegar parmetro "trLJ"

m_p_1

Si Z=0 entonces salta la siguiente


instruccin (goto m_p_1) para seguir
comparando con otros valores de "Push_count",
ya que no est fuera de rango.

; Continuamos comparando otros valores con Push_count


movf

Push_count,w ; W=Push_count

sublw .1

;
;
;
;

W=1-W (Parmetro trLJ?)


Si Push_count=1 entonces Z=1, lo que
implicar que el men esta en la opcin de
"trLJ"

; Probemos el bit Z del registro STATUS


btfsc STATUS,Z

;
;
;
;

goto

; Si Z=1 entonces esta en el parmetro "trLJ".


; Ve a desplegar parmetro "trLJ"

m_p_2

Si Z=0 entonces salta la siguiente


instruccin (goto m_p_2) para seguir
comparando con otros valores de "Push_count"
porque no esta en la opcin de "trLJ".

; Continuamos comparando otros valores con Push_count


movf

Push_count,w ; W=Push_count

sublw .2

;
;
;
;

W=2-W (Parmetro tAon?)


Si Push_count=2 entonces Z=1, lo que
implicar que el men esta en la opcin de
tAon

; Probemos el bit Z del registro STATUS


btfsc STATUS,Z

;
;
;
;

goto

; Si Z=1 entonces esta en parmetro "tAon".


; Ve a desplegar el parmetro "tAon"

m_p_3

Si Z=0 entonces salta la siguiente


instruccin (goto m_p_3) para seguir
comparando con otros valores de "Push_count"
porque no esta en la opcin de tAon.

; Continuamos comparando otros valores con Push_count


movf

Push_count,w ; W=Push_count

sublw .3

;
;
;
;

W=3-W (Parmetro tAoF?)


Si Push_count=3 entonces Z=1, lo que
implicar que el men esta en la opcin de
tAoF

; Probemos el bit Z del registro STATUS

424

btfsc STATUS,Z

;
;
;
;

goto

; Si Z=1 entonces esta en parmetro "tAoF".


; Ve a desplegar el parmetro "tAoF"

m_p_4

Si Z=0 entonces salta la siguiente


instruccin (goto m_p_4) para seguir
comparando con otros valores de "Push_count"
porque no esta en la opcin de tAoF.

; Continuamos comparando otros valores con Push_count


movf

Push_count,w ; W=Push_count

sublw .4

;
;
;
;

W=4-W (Parmetro ALoF?)


Si Push_count=4 entonces Z=1, lo que
implicar que el men esta en la opcin de
ALoF

; Probemos el bit Z del registro STATUS


btfsc STATUS,Z

;
;
;
;

goto

; Si Z=1 entonces esta en parmetro "ALoF".


; Ve a desplegar el parmetro "ALoF"

m_p_5

Si Z=0 entonces salta la siguiente


instruccin (goto m_p_8) para seguir
comparando con otros valores de "Push_count"
porque no esta en la opcin de "ALoF".

; Si llegamos hasta aqui es porque el nico valor de "Push_count"


; faltante es "5" por lo que se transferir el control al parmetro
; "ALon"
goto m_p_6
; Ve a desplegar parmetro "ALon"
; -------------------------------------------------------------------; Despliega que el men esta en la opcin de parmetro "trLJ"
m_p_1
movlw .1
movwf Push_count

; W=1
; Push_count=W

m_p_2
call disp_trLJ
; Indica parmetro "trLJ"
goto mp_1x
; -------------------------------------------------------------------; Despliega que el men esta en la opcin de parmetro "tAon"
m_p_3
call disp_tAon
; Indica parmetro "tAon"
goto mp_1x
; -------------------------------------------------------------------; Despliega que el men esta por seleccionar el parmetro "tAof"

425

m_p_4
call disp_tAof
; Indica parmetro "tAof"
goto mp_1x
; -------------------------------------------------------------------m_p_5
call

disp_ALoF

; Despliega parmetro "ALoF"

btfss Flags,AL_ON ; Si AL_ON=1, entonces salta la siguiente


; instruccin (call dec_point1).
call

dec_point1

; Enciende punto decimal en U1, porque


; AL_ON=1.

goto mp_1x
; -------------------------------------------------------------------; Despliega que el men esta por seleccionar el parmetro "ALon"
m_p_6
call

disp_ALon

; Indica parmetro "ALon"

btfsc Flags,AL_ON ; Si AL_ON=0, entonces salta la siguiente


; instruccin (call dec_point1).
call

dec_point1

; Enciende punto decimal en U1, porque


; AL_ON=0, es decir ALof=1.

; -------------------------------------------------------------------mp_1x
; Espera a que dejen de oprimir el botn
call

ref_pb

; Ve a leer el estado que guardan los botones

; Recordemos que la variable push_button=(0 0 0 0 PB4 PB3 PB2 PB1)


; (d7..d0)
; Verifca si la variable "Push_button" es diferente a cero, lo que
; implicar que algn botn fu oprimido.
movf

Push_button,w ; W=Push_button

; Probemos el bit Z del registro STATUS


btfss STATUS,Z

; Si Z=1 implica que ningn botn se encuentra


; oprimido, entonces salta la siguiente
; instruccin (goto mp_1x)

goto

mp_1x

; Continua la espera en esta malla (loop) local

call

Delay_25s

; Retardo de aproximadamente .25 seg.

goto

m_p0

; Salta al inicio de la malla principal

426

mp_2x
bcf
bcf
bcf
call

Flags,PT_RJ ; PT_RJ=0 (programa reloj inactivo)


Flags,PT_AON ; PT_AON=0 (programa Encendido de alarma
; inactivo)
Flags,PT_AOF ; PT_AOF=0 (programa Apagado de alarma
; inactivo)
Delay_25s

return

; Retardo de aproximadamente .25 seg.


; Salta al inicio de la malla principal

; En esta seccin de la rutina, se programar el parmetro deseado.


mp_enter
; Comparemos Push_count para ver que parmetro ha sido seleccionado.
movf

Push_count,w ; W=Push_count

sublw .1

; W=1-W (Parmetro trLJ?)


; Si Push_count=1 entonces Z=1, lo que

implicar
; que el men esta en la opcin de "trLJ"
; Probemos el bit Z del registro STATUS
btfsc STATUS,Z

;
;
;
;

goto

; Si Z=1 entonces esta en parmetro "trLJ".


; Ve a desplegar "HH.MM"

m_s_1

Si Z=0 entonces salta la siguiente


instruccin (goto m_s_1) para seguir
comparando con otros valores de "Push_count"
porque no esta en la opcin de "trLJ".

; Continuamos comparando otros valores con Push_count


movf

Push_count,w ; W=Push_count

sublw .2

;
;
;
;

W=2-W (Parmetro tAon?)


Si Push_count=2 entonces Z=1, lo que
implicar que el men esta en la opcin de
tAon

; Probemos el bit Z del registro STATUS


btfsc STATUS,Z

;
;
;
;

goto

; Si Z=1 entonces esta en parmetro "tAon".


; Ve a desplegar "HH.MM"

m_s_2

Si Z=0 entonces salta la siguiente


instruccin (goto m_s_2) para seguir
comparando con otros valores de "Push_count"
porque no esta en la opcin de tAon.

; Continuamos comparando otros valores con Push_count


movf

Push_count,w ; W=Push_count

427

sublw .3

;
;
;
;

W=3-W (Parmetro tAoF?)


Si Push_count=3 entonces Z=1, lo que
implicar que el men esta en la opcin de
tAoF

; Probemos el bit Z del registro STATUS


btfsc STATUS,Z

;
;
;
;

goto

; Si Z=1 entonces esta en parmetro "tAoF".


; Ve a desplegar "HH.MM"

m_s_3

Si Z=0 entonces salta la siguiente


instruccin (goto m_s_3) para seguir
comparando con otros valores de "Push_count"
porque no esta en la opcin de tAoF.

; Continuamos comparando otros valores con Push_count


movf

Push_count,w ; W=Push_count

sublw .4

;
;
;
;

W=4-W (Parmetro ALoF?)


Si Push_count=4 entonces Z=1, lo que
implicar que el men esta en la opcin de
ALoF

; Probemos el bit Z del registro STATUS


btfsc STATUS,Z

;
;
;
;

goto

; Si Z=1 entonces esta en parmetro "ALoF".


; Ve a desplegar el punto decimal en U1

m_s_4

Si Z=0 entonces salta la siguiente


instruccin (goto m_s_4) para seguir
comparando con otros valores de "Push_count"
porque no esta en la opcin de "ALoF".

; Si llegamos hasta aqui es porque el nico valor de "Push_count"


; faltante es "5" por lo que se transferir el control al parmetro
; "ALon"
goto

m_s_5

; Ve a desplegar el punto decimal en U1

; Despliega el tiempo del reloj (HH.MM)


m_s_1
bsf

Flags,PT_RJ ; PT_RJ=1 (programa tiempo de reloj activo)

movf
movwf
movf
movwf
movf
movwf
movf
movwf

c_rlj_hrs_d,w
hrs_d
c_rlj_hrs_u,w
hrs_u
c_rlj_min_d,w
min_d
c_rlj_min_u,w
min_u

;
;
;
;
;
;
;
;

W=c_rlj_hrs_d
hrs_d=W
W=c_rlj_hrs_u
hrs_u=W
W=c_rlj_min_d
min_d=W
W=c_rlj_min_u
min_u=W

; Actualiza informacin de la unidad de despliegue

428

m_s_0
movf

min_u,w

; W=min_u

call

conv_chr

;
;
;
;

Convierte el nmero contenido en el registro


W a un caracter grfico (7 segmentos)
desplegable.El resultado es depositado en el
registro W.

movwf Dig_1

; Dig_1=W
; (En Dig_1 se encuentra el caracter a
; desplegar en el dgito U1 de la unidad de
; despliegue)

movf

min_d,w

; W=min_d

call

conv_chr

;
;
;
;

Convierte el nmero contenido en el registro


W a un caracter grfico (7 segmentos)
desplegable.
El resultado es depositado en el registro W.

movwf Dig_2

; Dig_2=W
; (En Dig_2 se encuentra el caracter a
; desplegar en el dgito U2 de la unidad de
; despliegue)

movf

hrs_u,w

; W=hrs_u

call

conv_chr

;
;
;
;

Convierte el nmero contenido en el registro


W a un caracter grfico (7 segmentos)
desplegable.
El resultado es depositado en el registro W.

iorlw .1

; W=W+1
; Enciende el punto decimal del Dig_3.

movwf Dig_3

;
;
;
;

movf

hrs_d,w

; W=hrs_d

call

conv_chr

;
;
;
;

Convierte el nmero contenido en el registro


W a un caracter grfico (7 segmentos)
desplegable.
El resultado es depositado en el registro W.

;
;
;
;

Dig_4=W
(En Dig_4 se encuentra el caracter a
desplegar en el dgito U4 de la unidad de
despliegue)

movwf Dig_4

Dig_3=W
(En Dig_3 se encuentra el caracter a
desplegar en el dgito U3 de la unidad de
despliegue)

goto mp_3x
; --------------------------------------------------------------------

429

; Despliega el tiempo de activacin de la alarma (HH.MM)


m_s_2
bsf

Flags,PT_AON

; PT_AON=1 (programa Encendido de alarma


: activo)

movf
movwf
movf
movwf
movf
movwf
movf
movwf

c_aon_hrs_d,w
hrs_d
c_aon_hrs_u,w
hrs_u
c_aon_min_d,w
min_d
c_aon_min_u,w
min_u

;
;
;
;
;
;
;
;

W=c_aon_hrs_d
hrs_d=W
W=c_aon_hrs_u
hrs_u=W
W=c_aon_min_d
min_d=W
W=c_aon_min_u
min_u=W

goto m_s_0
; Actualiza la unidad de despliegue
; -------------------------------------------------------------------; Despliega el tiempo de desactivacin de la alarma (HH.MM)
m_s_3
bsf

Flags,PT_AOF

; PT_AOF=1 (programa Apagado de alarma


; activo)

movf
movwf
movf
movwf
movf
movwf
movf
movwf

c_aof_hrs_d,w
hrs_d
c_aof_hrs_u,w
hrs_u
c_aof_min_d,w
min_d
c_aof_min_u,w
min_u

;
;
;
;
;
;
;
;

W=c_aof_hrs_d
hrs_d=W
W=c_aof_hrs_u
hrs_u=W
W=c_aof_min_d
min_d=W
W=c_aof_min_u
min_u=W

goto m_s_0
; Actualiza la unidad de despliegue
; -------------------------------------------------------------------; Indica que el parmetro "ALoF" ha sido seleccionado
m_s_4
bcf

Flags,AL_ON ; AL_ON=0,(alarma de reloj deshabilitada).

call

dec_point1

; Enciende punto decimal en U1

goto m_p0
; -------------------------------------------------------------------; Indica que el parmetro "ALon" ha sido seleccionado
m_s_5
bsf

Flags,AL_ON ; AL_ON=1,(alarma de reloj habilitada).

call

dec_point1

goto

m_p0

; Enciende punto decimal en U1

430

; -------------------------------------------------------------------mp_3x
clrwdt

; Refresca temporizador de guardia (WDT)

call

refresca

; Refresca la unidad de despliegue


; (solo si fuese tiempo de)

call

Lee_PB

;
;
;
;
;

Lee el estado que guardan los botones


PB1=MODO
PB2=ENTER
PB3=SIGUIENTE
PB4=PREVIO

; Recordemos que la variable push_button=(0 0 0 0 PB4 PB3 PB2 PB1)


; (d7..d0)
; Verifca si la variable "Push_button" es diferente a cero, lo que
; implicar que algn botn fu oprimido.
movf

Push_button,w ; W=Push_button

; Probemos el bit Z del registro STATUS


; Si el bit Z del registro STATUS resultase ser "1", implicar que
; ningn botn fu oprimido.
btfsc STATUS,Z

; Si Z=0 entonces saltate la siguiente


; instruccin (goto mp_3x).

goto

; Si Z=1 regresa al inicio de esta malla (loop)

mp_3x

; Aqui hemos llegado porque Z=0, lo cual implica que algn botn fu
; oprimido. Ahora se verificar cual fu el botn (PBx) oprimido.
;
;
;
;

El valor del botn oprimido fu guardado en la variable Push_button,


por lo que se comparar dicho valor, primero con el valor de PB1,
luego con el de PB2, PB3 y finalmente con el de PB4, hasta saber
cual botn fu oprimido.
movf

Push_button,w ; W=Push_button

; Filtra el bit0 correspondiente a PB1


andlw Modo

; W=W . Modo
; MODO (PB1)

; Probemos el bit Z del registro STATUS


btfss STATUS,Z

; Si Z=1 entonces salta porque no fu PB1,


; de lo contrario (Z=0) ejecuta la prxima
; instruccin (goto mp_2x)

goto

; El botn MODO fu oprimido


; regresa al men principal

mp_2x

431

; Aqui llegamos porque Z=1 (o sea, no fu PB1 el botn oprimido).


; Ahora vamos a realizar el mismo proceso pero comparando con PB2.
movf

Push_button,w ; W=Push_button

; Filtra el bit1 correspondiente a PB2


andlw Enter

; W=W . Enter
; ENTER (PB2)

; Probemos el bit Z del registro STATUS


btfss STATUS,Z

; Si Z=1 entonces salta porque no fu PB2,


; de lo contrario (Z=0) ejecuta la prxima
; instruccin (goto mp_3x)

goto

; El botn ENTER fu oprimido, ignoralo.

mp_3x

; Aqui llegamos porque Z=1 (o sea, no fu PB2 el botn oprimido).


; Ahora vamos a realizar el mismo proceso pero comparando con PB4 que
; es la ltima opcin.
movf

Push_button,w ; W=Push_button

; Filtra el bit3 correspondiente a PB4


andlw Siguiente

; W=W . Siguiente
; SIGUIENTE (PB4)

; Probemos el bit Z del registro STATUS


btfss STATUS,Z

; Si Z=1 entonces salta porque no fu PB4,


; de lo contrario (Z=0) ejecuta la prxima
; instruccin (goto prog_sig)

goto

; El botn de SIGUIENTE fu oprimido

prog_sig

; Aqui llegamos porque no fueron oprimidos ni PB1, PB2 ni PB4, por lo


; tanto se trata de PB3
goto prog_prev
; El botn de PREVIO fu oprimido
; -------------------------------------------------------------------; Esta seccin (prog_sig) nos permite programar los minutos del tiempo
; del reloj.
prog_sig
incf
movf

min_u,f
min_u,w

sublw .10

; min_u=min_u+1
; W=min_u
;
;
;
;

W=10-W (fuera de rango?)


Si c_min_u=10 entonces Z=1, lo que
implica que habr que hacer cero este
contador e incrementar el contador c_min_d

; Probemos el bit Z del registro STATUS

432

btfss STATUS,Z

; Si Z=1 entonces salta la siguiente


; instruccin (goto p_s1)

goto

p_s1

; Si Z=0 implica que esta en rango por lo que


; regresa a continuar en esta malla (loop).

clrf
incf
movf

min_u
min_d,f
min_d,w

; min_u=0
; min_d=min_d+1
; W=min_d

sublw .6

;
;
;
;

W=6-W (fuera de rango?)


Si c_min_d=6 entonces Z=1, lo que
implica que habr que bacer cero este
contador

; Probemos el bit Z del registro STATUS


btfss STATUS,Z

; Si Z=1 entonces salta la siguiente


; instruccin (goto p_s1) para hacer min_d=0.

goto

p_s1

; Si Z=0 implica que esta en rango por lo que


; ve a actualizar la unidad de despliegue.

clrf

min_d

; min_d=0

p_s1
; Verifica en que parmetro de programacin de tiempo estamos
; trabajando
; Primero verifica si estamos programando el tiempo de reloj
btfsc Flags,PT_RJ ; Si PT_RJ=0 entonces salta la siguiente
; instruccin (goto p_s2) porque no estamos
; en este parmetro.
goto

p_s2

; Estamos programando el tiempo del reloj


; ve a ps_2

; Luego verifica si estamos programando el tiempo de Encendido de


; Alarma
btfsc Flags,PT_AON ; Si PT_AON=0 entonces salta la siguiente
; instruccin (goto p_s3) porque no estamos
; en este parmetro.
goto p_s3
; Finalmente por eliminacin estamos programando el tiempo de Apagado
; de Alarma
p_s4
movf
movwf
movf
movwf
movf
movwf

hrs_d,w
c_aof_hrs_d
hrs_u,w
c_aof_hrs_u
min_d,w
c_aof_min_d

;
;
;
;
;
;

W=hrs_d
c_aof_hrs_d=W
W=hrs_u
c_aof_hrs_u=W
W=min_d
c_aof_min_d=W

433

movf min_u,w
movwf c_aof_min_u

; W=min_u
; c_aof_min_u=W

; Actualiza la informacin de la unidad de despliegue.


p_s5
movf

hrs_d,w

; W=hrs_d

call

conv_chr

; Convierte dato a caracter desplegable

movwf Dig_4

; Dig_4=W

movf

hrs_u,w

; W=hrs_u

call

conv_chr

; Convierte dato a caracter desplegable

movwf Dig_3

; Dig_3=W

movf

min_d,w

; W=min_d

call

conv_chr

; Convierte dato a caracter desplegable

movwf Dig_2

; Dig_2=W

movf

min_u,w

; W=min_u

call

conv_chr

; Convierte dato a caracter desplegable

movwf Dig_1

; Dig_1=W

call
call

dec_point3
Delay_25s

; Enciende punto decimal en U3


; Retardo de aproximadamente .25 seg.

goto

mp_3x

; regresa a continuar en esta malla (loop).

; En caso de que estemos trabajando programando el tiempo de reloj


p_s2
movf
movwf
movf
movwf
movf
movwf
movf
movwf

hrs_d,w
c_rlj_hrs_d
hrs_u,w
c_rlj_hrs_u
min_d,w
c_rlj_min_d
min_u,w
c_rlj_min_u

;
;
;
;
;
;
;
;

W=hrs_d
c_rlj_hrs_d=W
W=hrs_u
c_rlj_hrs_u=W
W=min_d
c_rlj_min_d=W
W=min_u
c_rlj_min_u=W

goto

p_s5

; ve a actualizar la unidad de despliegue

; En caso de que estemos programando el tiempo de Encendido de Alarma


p_s3
movf
movwf
movf
movwf
movf

hrs_d,w
c_aon_hrs_d
hrs_u,w
c_aon_hrs_u
min_d,w

;
;
;
;
;

W=hrs_d
c_aon_hrs_d=W
W=hrs_u
c_aon_hrs_u=W
W=min_d

434

movwf c_aon_min_d
movf min_u,w
movwf c_aon_min_u

; c_aon_min_d=W
; W=min_u
; c_aon_min_u=W

goto

; ve a actualizar la unidad de despliegue

p_s5

; Esta seccin (prog_prev) nos permite programar las horas del tiempo
; del reloj.
prog_prev
incf
movf

hrs_u,f
hrs_u,w

sublw .4

; hrs_u=hrs_u+1
; W=hrs_u
;
;
;
;
;

W=4-W (24 hrs?)


Si hrs_u=4 entonces Z=1, lo que
implica que habr que hacer cero este
contador asi como el contador hrs_d si
y solo si el contador hrs_d=2

; Probemos el bit Z del registro STATUS


btfss STATUS,Z

;
;
;
;

goto

; Si Z=0 implica que el contador no fu 4 por


; lo que habr que comparar este contador con
; 10.

p_p1

Si Z=1 entonces salta la siguiente


instruccin (goto p_p1) para seguir
comparando con otros valores, ya que no est
fuera de rango.

; Si llegamos aqui es porque el contador hrs_u=4, por lo que tendremos


; que comparar el contador hrs_d con 2.
movf

hrs_d,w

sublw .2

; W=hrs_d
;
;
;
;
;

W=2-W (24 hrs?)


Si hrs_d=2 entonces Z=1, lo que
implica que habr que bacer cero este
contador asi como el contador hrs_d si
y solo si el contador hrs_d=2

; Probemos el bit Z del registro STATUS


btfss STATUS,Z

; Si Z=1 entonces salta la siguiente


; instruccin (goto p_p1) para hacer los
; contadores cero.

goto

p_p1

; Si Z=0 implica que el contador no fu 2 por


; lo que habr que comparar el contador hrs_d
; con 10.

clrf
clrf

hrs_d
hrs_u

; hrs_d=0
; hrs_u=0

goto

p_s1

; ve a actualizar la unidad de despliegue.

; Continua analizando los contadores de las horas.

435

p_p1
movf

hrs_u,w

sublw .10

; W=hrs_u
;
;
;
;

W=10-W (fuera de rango?)


Si hrs_u=10 entonces Z=1, lo que
implica que habr que bacer cero este
contador e incrementar el contador hrs_d

; Probemos el bit Z del registro STATUS


btfss STATUS,Z

; Si Z=1 entonces salta la siguiente


; instruccin (goto p_s1) para hacer hrs_u=0.

goto

p_s1

; Si Z=0 implica que esta en rango por lo que


; regresa a continuar en esta malla (loop).

clrf

hrs_u

; hrs_u=0

incf
movf

hrs_d,f
hrs_d,w

; min_d=hrs_d+1
; W=hrs_d

sublw .3

;
;
;
;

W=3-W (fuera de rango?)


Si hrs_d=3 entonces Z=1, lo que
implica que habr que bacer cero el contador
hrs_d

; Probemos el bit Z del registro STATUS


btfss STATUS,Z

; Si Z=1 entonces salta la siguiente


; instruccin (goto p_s1) para hacer hrs_d=0.

goto

p_s1

; Si Z=0 implica que esta en rango por lo que


; ve a actualizar la unidad de despliegue.

clrf

hrs_d

; hrs_d=0

goto p_s1
; ve a actualizar la unidad de despliegue.
; -------------------------------------------------------------------; ******************************************************
; Rutina que verifica si los botones estan sin oprimir
; ******************************************************
;
;
;
;

Esta rutina refrescar el temporizador de guardia, refrescar la


unidad de despliegue, si le corresponde, leer el estado que guardan
los botones (PBx) y posteriormente depositar en la variable
Push_button el estado de los botones.

ref_pb
clrwdt

; Refresca temporizador de guardia (WDT)

call

refresca

; Refresca unidad de despliegue (si es tiempo


; de)

call

Lee_PB

; Lee el estado de los botones (push buttons)

436

;
;
;
;

PB1=MODO
PB2=ENTER
PB3=PREVIO
PB4=SIGUIENTE

return
; Regreso de subrutina
; -------------------------------------------------------------------; ******************************************************
; Rutina de habilitacin de interrupciones
; ******************************************************
enb_int
movlw B'10100000' ; W=0xA0
; Registro INTCON (0Bh) (d7 .. d0)
; GIE EEIE T0IE INTE RBIE T0IF INTF RBIF
; GIE: Bit de habilitacin de interrupcin
;
global
; 1 = Habilita todas las interrupciones nomascaradas
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;

0 = Deshabilita todas las interrupciones


EEIE: Bit de habilitacin de interrupcin por
una escritura completa en memoria EEPROM
1 = Habilita las interrupciones
0 = Deshabilita las interrupciones
T0IE: Bit de habilitacin de interrupcin por
sobreflujo de TMR0
1 = Habilita las interrupciones de TMR0
0 = Deshabilita las interrupciones de TMR0
INTE: Bit de habilitacin de interrupcin por
una interrupcion externa en el pin RB0/INT
1 = Habilita las interrupciones externas
sobre el pin RB0/INT
0 = Deshabilita las interrupciones externas
sobre el pin RB0/INT
RBIE: Bit de habilitacin de interrupcin por
un cambio de estado en el puerto PORTB
1 = Habilita las interrupciones por un
cambio
0 = Deshabilita las interrupciones por un
cambio
T0IF: Bit de bandera de interrupcin por una
condicin de sobreflujo en el temporizador
TMR0
1 = Hubo una condicin de sobreflujo en TMR0
(deber ser apagado por programa)
0 = No hubo ninguna condicin de sobreflujo
en TMR0
INTF: Bit de bandera de interrupcin por una
interrupcin externa en el pin INT
1 = Una interrupcin externa sobre el pin
RB0/INT ocurri (deber ser apagado por
programa)
0 = Ninguna interrupcin externa sobre el
pin RB0/INT ocurri

437

; GPIF: Bit de bandera de interrupcin por un


;
cambio de estado en PORTB
; 1 = Al menos hubo un cambio de estado en los
;
pines RB4 a RB7 (deber der apagado por
;
programa)
; 0 = No hubo ningun cambio de estado en los
;
pines RB4 a RB7
movwf INTCON

; INTCON=W
; Habilita interrupciones del temporizador TMR0

return
; regreso de subrutina
; -------------------------------------------------------------------; ******************************************************
; Rutina de deshabilitacin de interrupciones
; ******************************************************
dis_int
movlw B'00000000' ; W=0
; Registro INTCON (0Bh) (d7 .. d0)
; GIE EEIE T0IE INTE RBIE T0IF INTF RBIF
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;

GIE: Bit de habilitacin de interrupcin


global
1 = Habilita todas las interrupciones
no-mascaradas
0 = Deshabilita todas las interrupciones
EEIE: Bit de habilitacin de interrupcin por
una escritura completa en memoria EEPROM
1 = Habilita las interrupciones
0 = Deshabilita las interrupciones
T0IE: Bit de habilitacin de interrupcin por
sobreflujo de TMR0
1 = Habilita las interrupciones de TMR0
0 = Deshabilita las interrupciones de TMR0
INTE: Bit de habilitacin de interrupcin por
una interrupcion externa en el pin RB0/INT
1 = Habilita las interrupciones externas
sobre el pin RB0/INT
0 = Deshabilita las interrupciones externas
sobre el pin RB0/INT
RBIE: Bit de habilitacin de interrupcin por
un cambio de estado en el puerto PORTB
1 = Habilita las interrupciones por un
cambio
0 = Deshabilita las interrupciones por un
cambio
T0IF: Bit de bandera de interrupcin por una
condicin de sobreflujo en el temporizador
TMR0
1 = Hubo una condicin de sobreflujo en TMR0
(deber ser apagado por programa)
0 = No hubo ninguna condicin de sobreflujo
en TMR0
INTF: Bit de bandera de interrupcin por una

438

;
interrupcin externa en el pin INT
; 1 = Una interrupcin externa sobre el pin
;
RB0/INT ocurri (deber ser apagado por
;
programa)
; 0 = Ninguna interrupcin externa sobre el
;
pin RB0/INT ocurri
; GPIF: Bit de bandera de interrupcin por un
;
cambio de estado en PORTB
; 1 = Al menos hubo un cambio de estado en los
;
pines RB4 a RB7 (deber der apagado por
;
programa)
; 0 = No hubo ningun cambio de estado en los
;
pines RB4 a RB7
movwf INTCON

; INTCON=W
; Deshabilita interrupciones del temporizador
; TMR0

return
; regreso de subrutina
; -------------------------------------------------------------------; ******************************************************
; Rutina de despliegue del mensaje RELOJ
; ******************************************************
disp_reloj
movlw chr_r
; W='r'
movwf Dig_4
; Dig_4=W
movlw chr_L
; W='L'
movwf Dig_3
; Dig_3=W
movlw chr_0
; W='O'
movwf Dig_2
; Dig_2=W
movlw chr_J
; W='J'
movwf Dig_1
; Dig_1=W
return
; regreso de subrutina
; -------------------------------------------------------------------; ******************************************************
; Rutina de despliegue del mensaje CONTADOR
; ******************************************************
disp_contador
movlw chr_c
; W='c'
movwf Dig_4
; Dig_4=W
movlw chr_o
; W='o'
movwf Dig_3
; Dig_3=W
movlw chr_n
; W='n'
movwf Dig_2
; Dig_2=W
movlw chr_t
; W='t'
movwf Dig_1
; Dig_1=W
return
; regreso de subrutina
; -------------------------------------------------------------------; ******************************************************

439

; Rutina de despliegue del mensaje PROGRAMAR


; ******************************************************
disp_programar
movlw chr_P
; W='P'
movwf Dig_4
; Dig_4=W
movlw chr_r
; W='r'
movwf Dig_3
; Dig_3=W
movlw chr_o
; W='o'
movwf Dig_2
; Dig_2=W
movlw chr_g
; W='g'
movwf Dig_1
; Dig_1=W
return
; regreso de subrutina
; -------------------------------------------------------------------; ******************************************************
; Rutina de despliegue del mensaje ALoF
; ******************************************************
disp_ALoF
movlw chr_A
; W='A'
movwf Dig_4
; Dig_4=W
movlw chr_L
; W='L'
movwf Dig_3
; Dig_3=W
movlw chr_o
; W='o'
movwf Dig_2
; Dig_2=W
movlw chr_F
; W='F'
movwf Dig_1
; Dig_1=W
return
; regreso de subrutina
; -------------------------------------------------------------------; ******************************************************
; Rutina de despliegue del mensaje ALon
; ******************************************************
disp_ALon
movlw chr_A
; W='A'
movwf Dig_4
; Dig_4=W
movlw chr_L
; W='L'
movwf Dig_3
; Dig_3=W
movlw chr_o
; W='o'
movwf Dig_2
; Dig_2=W
movlw chr_n
; W='n'
movwf Dig_1
; Dig_1=W
return
; regreso de subrutina
; -------------------------------------------------------------------; ******************************************************
; Rutina de despliegue del mensaje trLJ
; ******************************************************
disp_trLJ
movlw chr_t
movwf Dig_4

; W='t'
; Dig_4=W

440

movlw chr_r
; W='r'
movwf Dig_3
; Dig_3=W
movlw chr_L
; W='L'
movwf Dig_2
; Dig_2=W
movlw chr_J
; W='J'
movwf Dig_1
; Dig_1=W
return
; regreso de subrutina
; -------------------------------------------------------------------; ******************************************************
; Rutina de despliegue del mensaje tAon
; ******************************************************
disp_tAon
movlw chr_t
; W='t'
movwf Dig_4
; Dig_4=W
movlw chr_A
; W='A'
movwf Dig_3
; Dig_3=W
movlw chr_o
; W='o'
movwf Dig_2
; Dig_2=W
movlw chr_n
; W='n'
movwf Dig_1
; Dig_1=W
return
; regreso de subrutina
; -------------------------------------------------------------------; ******************************************************
; Rutina de despliegue del mensaje tAof
; ******************************************************
disp_tAof
movlw chr_t
; W='t'
movwf Dig_4
; Dig_4=W
movlw chr_A
; W='A'
movwf Dig_3
; Dig_3=W
movlw chr_o
; W='o'
movwf Dig_2
; Dig_2=W
movlw chr_F
; W='F'
movwf Dig_1
; Dig_1=W
return
; regreso de subrutina
; -------------------------------------------------------------------; ******************************************************
; Rutina de despliegue del punto decimal en Dig_1
; ******************************************************
dec_point1
movlw .1
; Prende el punto decimal en Dig_1
iorwf Dig_1,f
; Dig_1=Dig_1+W
return
; regreso de subrutina
; -------------------------------------------------------------------; ******************************************************
; Rutina de despliegue del punto decimal en Dig_3

441

; ******************************************************
dec_point3
movlw .1
; Prende el punto decimal en Dig_3
iorwf Dig_3,f
; Dig_3=Dig_3+W
return
; regreso de subrutina
; -------------------------------------------------------------------; **********************************************************
; Rutina para convertir un nmero en un caracter desplegable
; **********************************************************
; Esta rutina tiene como entrada un nmero (byte) localizado
; en el registro W, el cual se desea desplegar.
; El nmero deber ser decimal.
conv_chr
movwf ftemp

; ftemp=W
; salva temporalmente el registro W

; Analiza si el registro W=0 (dato de entrada).


btfsc STATUS,Z

; Si Z=0 implica que W es diferente


; a 0, entonces salta la siguiente
; instruccin (goto c_c0)

goto

; Si Z=1 implica que W=0 y por tanto


; ve a convertirlo.

c_c0

; Analiza si el registro W=1 (dato de entrada).


movf

ftemp,w

; W=ftemp

sublw .1

; W=W-1

btfsc STATUS,Z

; Si Z=0 implica que W es diferente


; a 1, entonces salta la siguiente
; instruccin (goto c_c1)

goto

; Si Z=1 implica que W=1 y por tanto


; ve a convertirlo.

c_c1

; Analiza si el registro W=2 (dato de entrada).


movf

ftemp,w

; W=ftemp

sublw .2

; W=W-2

btfsc STATUS,Z

; Si Z=0 implica que W es diferente


; a 2, entonces salta la siguiente
; instruccin (goto c_c2)

goto

; Si Z=1 implica que W=2 y por tanto


; ve a convertirlo.

c_c2

; Analiza si el registro W=3 (dato de entrada).

442

movf

ftemp,w

; W=ftemp

sublw .3

; W=W-3

btfsc STATUS,Z

; Si Z=0 implica que W es diferente


; a 3, entonces salta la siguiente
; instruccin (goto c_c3)

goto

; Si Z=1 implica que W=3 y por tanto


; ve a convertirlo.

c_c3

; Analiza si el registro W=4 (dato de entrada).


movf ftemp,w
sublw .4

; W=ftemp
; W=W-4

btfsc STATUS,Z

; Si Z=0 implica que W es diferente


; a 4, entonces salta la siguiente
; instruccin (goto c_c4)

goto

; Si Z=1 implica que W=4 y por tanto


; ve a convertirlo.

c_c4

; Analiza si el registro W=5 (dato de entrada).


movf ftemp,w
sublw .5

; W=ftemp
; W=W-5

btfsc STATUS,Z

; Si Z=0 implica que W es diferente


; a 5, entonces salta la siguiente
; instruccin (goto c_c5)

goto

; Si Z=1 implica que W=5 y por tanto


; ve a convertirlo.

c_c5

; Analiza si el registro W=6 (dato de entrada).


movf ftemp,w
sublw .6

; W=ftemp
; W=W-6

btfsc STATUS,Z

; Si Z=0 implica que W es diferente


; a 6, entonces salta la siguiente
; instruccin (goto c_c6)

goto

; Si Z=1 implica que W=6 y por tanto


; ve a convertirlo.

c_c6

; Analiza si el registro W=7 (dato de entrada).


movf ftemp,w
sublw .7

; W=ftemp
; W=W-7

btfsc STATUS,Z

; Si Z=0 implica que W es diferente


; a 7, entonces salta la siguiente
; instruccin (goto c_c7)

443

goto

c_c7

; Si Z=1 implica que W=7 y por tanto


; ve a convertirlo.

; Analiza si el registro W=8 (dato de entrada).


movf ftemp,w
sublw .8

; W=ftemp
; W=W-8

btfsc STATUS,Z

; Si Z=0 implica que W es diferente


; a 8, entonces salta la siguiente
; instruccin (goto c_c8)

goto

; Si Z=1 implica que W=8 y por tanto


; ve a convertirlo.

c_c8

; Aqui llegamos porque W no contenia ningn numero entre 0 y 8 y por


; lo tanto tendr que ser 9.
; Convierte W=9
c_c9
movlw chr_9
return
; Convierte W=0
c_c0
movlw chr_0
return
; Convierte W=1
c_c1
movlw chr_1
return
; Convierte W=2
c_c2
movlw chr_2
return
; Convierte W=3
c_c3
movlw chr_3
return
; Convierte W=4
c_c4
movlw chr_4
return
; Convierte W=5
c_c5
movlw chr_5
return
; Convierte W=6
c_c6
movlw chr_6
return

; W=9
; regreso de subrutina
; con el dato convertido en W
; W=0
; regreso de subrutina
; con el dato convertido en W
; W=1
; regreso de subrutina
; con el dato convertido en W
; W=2
; regreso de subrutina
; con el dato convertido en W
; W=3
; regreso de subrutina
; con el dato convertido en W
; W=4
; regreso de subrutina
; con el dato convertido en W
; W=5
; regreso de subrutina
; con el dato convertido en W
; W=6
; regreso de subrutina

444

; con el dato convertido en W


; Convierte W=7
c_c7
movlw chr_7
return

; W=7
; regreso de subrutina
; con el dato convertido en W

; Convierte W=8
c_c8
movlw chr_8
return

; W=8
; regreso de subrutina
; con el dato convertido en W
; --------------------------------------------------------------------

; ******************************************************
; Rutina de envio de datos al registro de corrimiento
; ******************************************************
; Unidad de despliegue: U4 U3 U2 U1
; El orden de los bits: (MSB ... LSB), el bit LSB primero.
;
;
;
;
;
;
;
;

El despliegue de los dgitos se divide en dos grupos:


El grupo de los pares (U2,U4) y el grupo de los nones
(U1,U3). El refresco de la informacin ser alternada,
es decir, se refrescar primero al grupo de los nones
y luego al grupo de los pares, nones, pares, nones,
pares y as sucesivamente e indefinidamente sin
interrupcin, ya que de hacerlo, esto causara un
efecto indeseable en la unidad de despliegue.

shift16
; Pregunta primero a que grupo le toca refrescar
; (nones o pares).
btfss Flags,NONES ; Si NONES=1 entonces salta
; la siguiente instruccin
; (goto sh_pares).
goto

sh_pares

; else NONES=0

; Refresca los dgitos nones (D3 D1), D1 primero.


; Esto se logra depositando el valor que se desea enviar al
; registro de corrimiento, en la variable "Digito"
sh_nones
; El dgito 1 (D1) ser depositado en la variable "Digito"
movf Dig_1,w
movwf Digito

; W=Dig_1
; Digito=W

; Entonces enva los 8 primeros bits al registro de corrimiento


call

envia_byte

; Envia 8 bits al registro de


; corrimiento, iniciando con el
; bit menos significante (b0).

445

; El dgito 3 (D3) ser depositado en la variable "Digito"


movf
goto

Dig_3,w
sh_1

; W=Dig_3
; continua en sh_1

; Refresca los dgitos pares (D4 D2), D2 primero.


; Esto se logra depositando el valor que se desea enviar al
; registro de corrimiento, en la variable "Digito"
sh_pares
movf Dig_2,w
movwf Digito

; W=Dig_2
; Digito=W

call

envia_byte

; Envia 8 bits al registro de


; corrimiento, iniciando con el
; bit menos significante (b0).

movf

Dig_4,w

; W=Dig_4

sh_1
movwf Digito

; Digito=W

; Entonces enva los 8 ltimos bits al registro de corrimiento


call

envia_byte

; Envia 8 bits al registro de


; corrimiento, iniciando con el
; bit menos significante (b0).

; Una vez enviados los 2 bytes (16 bits) al registro de corrimiento,


; transfierelos a los "latches" de salida mediante un pulso en el pin
; STB de los registros de corrimiento.
call

pulso_stb

; Envia un pulso al pin STB

; Actualiza la informacin de los bits de control


btfss Flags,NONES ; Si NONES=1 entonces salta la
; siguiente instruccin (goto sh_2)
goto

sh_2

; Si NONES=0 entonces ve a cambiarlo


; por NONES=1 para que la prxima vez
; le toque el turno a los dgito nones.

; Aqui hemos llegado porque NONES=1, lo cual implica que deber ser
; cambiado a NONES=0 para que la prxima vez que la unidad de
; despliegue sea refrescada, le toque el turno a los dgitos pares.
bcf
;
;
;
;

Flags,NONES ; NONES=0

Y como estamos resfrescando los nones, se activar la seal AC_H


para que el transistor Q3 se active y la seal AC_L prenda el
transistor Q2 que alimentar el pin 2 de las unidades de despliegue
U1 y U3 (nones).
bsf

PORTA,RA3

; AC_H = 1 (Refresca toggle)

446

return

; Regreso de subrutina

sh_2
; Aqui hemos llegado porque NONES=0, lo cual implica que deber ser
; cambiado a NONES=1 para que la prxima vez que la unidad de
; despliegue sea refrescada, le toque el turno a los dgitos nones.
bsf

Flags,NONES ; NONES=1

; Y como estamos resfrescando los pares, se desactivar la seal AC_H


; para que prenda el transistor Q1 que alimentar el pin 2 de las
; unidades de despliegue U2 y U4 (pares).
bcf

PORTA,RA3

; AC_H = 0 (Refresca toggle)

return
; Regreso de subrutina
; -------------------------------------------------------------------; ******************************************************
; Rutina generadora de un pulso de reloj (CLK)
; ******************************************************
; Se asume que el bit RA0 del puerto PORTA se encuentra en "0"
; CLK=0
pulso_clk
nop
nop
bsf

; Deja que el dato se estabilice


; usando 2 ciclos de instruccin
PORTA,RA0

nop
nop
bcf

; Genera una transicin 0 -> 1


; en la lnea CLK (U7-17)
; CLK=1
; Deja que el pulso se estabilice
; usando 2 ciclos de instruccin

PORTA,RA0

; Genera una transicin 1 -> 0


; en la lnea CLK (U7-17)
; CLK=0

return
; Regreso de subrutina
; -------------------------------------------------------------------; ******************************************************
; Rutina generadora de un pulso de atrapado (STB)
; ******************************************************
; Se asume que el bit RA2 del puerto PORTA se encuentra en "0"
; STB=0
pulso_stb
nop
nop

; Deja que el dato se estabilice


; usando 2 ciclos de instruccin

447

bsf

PORTA,RA2

nop
nop
bcf

; Genera una transicin 0 -> 1


; en la lnea STB (U7-1)
; STB=1
; Deja que el pulso se estabilice
; usando 2 ciclos de instruccin

PORTA,RA2

; Genera una transicin 1 -> 0


; en la lnea STB (U7-1)
; STB=0

return
; Regreso de subrutina
; -------------------------------------------------------------------; ******************************************************
; Rutina de repeticin de dgito
; ******************************************************
; Esta rutina guarda el contenido del registro W en los dgitos
; U1 a U4. El registro W contiene el dato a guardar.
rpt_dig
movwf
movwf
movwf
movwf

Dig_1
Dig_2
Dig_3
Dig_4

;
;
;
;

Dig_1=W
Dig_2=W
Dig_3=W
Dig_4=W

return
; Regreso de subrutina
; -------------------------------------------------------------------; ****************************************************************
; Rutina de envio de 8 bits (un byte) hacia el reg. de corrimiento
; ****************************************************************
; Esta rutina es la encargada de enviar 8 bits (un byte) hacia
; el registro de corrimiento. El dato a enviar se encuentra en
; la variable "Digito".
envia_byte
;
;
;
;
;

Primeramente, recordemos que el registro de corrimiento tiene 8


"latches" de salida (Q1-Q8), y que el bit que primero entre al
registro, corresponder a la salida Q8, es decir que deber
entrar primero el bit ms significante (MSB). En nuestro caso
tendremos que el orden de los dos bytes ser:

; LSB
; Q1 Q2 Q3 Q4 Q5 Q6 Q7 Q8
; ------------- U6 ------------;
(Dgitos U4 y U3)

MSB
Q1 Q2 Q3 Q4 Q5 Q6 Q7 Q8
------------- U5 ------------(Dgitos U2 y U1)

; Esta rutina envia solo un byte hacia el registro de corrimiento, por


; lo que ser necesario entrar dos veces a esta rutina para mandar los
; dos bytes que integran el registro de corrimiento.

448

; Por lo tanto, empecemos a enviar el primer bit, o sea, el bit ms


; significante:
; Bit 7:
btfsc Digito,bit7 ; Si bit7=0 entonces salta la
; siguiente instruccin (goto
goto

s_b7

s_b7)

; de lo contrario (bit7=1)

; Aqui estamos porque bit7=0, pero como necesitamos negar el dato


; debido a la configuracin (de la unidad de despliegue) de nodo
; comn, entonces el bit7 deber ser "1".
bsf

PORTA,RA1

; DATA=1

goto

s_c7

; Ve a generar el pulso de reloj

s_b7
; Aqui estamos porque bit7=1, pero como necesitamos negar el dato
; debido a la configuracin (de la unidad de despliegue) de nodo
; comn, entonces el bit7 deber ser "0".
bcf

PORTA,RA1

; DATA=0

call

pulso_clk

; genera pulso de reloj (CLK)

s_c7
; Procesa el siguiente bit
; Bit 6:
btfsc Digito,bit6 ; Si bit6=0 entonces salta la
; siguiente instruccin (goto
goto

s_b6

s_b6)

; de lo contrario (bit6=1)

; Aqui estamos porque bit6=0, pero como necesitamos negar el dato


; debido a la configuracin (de la unidad de despliegue) de nodo
; comn, entonces el bit6 deber ser "1".
bsf

PORTA,RA1

; DATA=1

goto

s_c6

; Ve a generar el pulso de reloj

s_b6
; Aqui estamos porque bit6=1, pero como necesitamos negar el dato
; debido a la configuracin (de la unidad de despliegue) de nodo
; comn, entonces el bit6 deber ser "0".
bcf

PORTA,RA1

; DATA=0

call

pulso_clk

; genera pulso de reloj (CLK)

s_c6
; Procesa el siguiente bit
; Bit 5:

449

btfsc Digito,bit5 ; Si bit5=0 entonces salta la


; siguiente instruccin (goto
goto

s_b5

s_b5)

; de lo contrario (bit5=1)

; Aqui estamos porque bit5=0, pero como necesitamos negar el dato


; debido a la configuracin (de la unidad de despliegue) de nodo
; comn, entonces el bit5 deber ser "1".
bsf
goto

PORTA,RA1
s_c5

; DATA=1
; Ve a generar el pulso de reloj

s_b5
; Aqui estamos porque bit5=1, pero como necesitamos negar el dato
; debido a la configuracin (de la unidad de despliegue) de nodo
; comn, entonces el bit5 deber ser "0".
bcf

PORTA,RA1

; DATA=0

call

pulso_clk

; genera pulso de reloj (CLK)

s_c5
; Procesa el siguiente bit
; Bit 4:
btfsc Digito,bit4 ; Si bit4=0 entonces salta la
; siguiente instruccin (goto
goto

s_b4

s_b4)

; de lo contrario (bit4=1)

; Aqui estamos porque bit4=0, pero como necesitamos negar el dato


; debido a la configuracin (de la unidad de despliegue) de nodo
; comn, entonces el bit4 deber ser "1".
bsf

PORTA,RA1

; DATA=1

goto

s_c4

; Ve a generar el pulso de reloj

s_b4
; Aqui estamos porque bit4=1, pero como necesitamos negar el dato
; debido a la configuracin (de la unidad de despliegue) de nodo
; comn, entonces el bit4 deber ser "0".
bcf

PORTA,RA1

; DATA=0

call

pulso_clk

; genera pulso de reloj (CLK)

s_c4
; Procesa el siguiente bit
; Bit 3:
btfsc Digito,bit3 ; Si bit3=0 entonces salta la
; siguiente instruccin (goto
goto

s_b3

; de lo contrario (bit3=1)

450

s_b3)

; Aqui estamos porque bit3=0, pero como necesitamos negar el dato


; debido a la configuracin (de la unidad de despliegue) de nodo
; comn, entonces el bit3 deber ser "1".
bsf

PORTA,RA1

; DATA=1

goto

s_c3

; Ve a generar el pulso de reloj

s_b3
; Aqui estamos porque bit3=1, pero como necesitamos negar el dato
; debido a la configuracin (de la unidad de despliegue) de nodo
; comn, entonces el bit3 deber ser "0".
bcf

PORTA,RA1

; DATA=0

call

pulso_clk

; genera pulso de reloj (CLK)

s_c3
; Procesa el siguiente bit
; Bit 2:
btfsc Digito,bit2 ; Si bit2=0 entonces salta la
; siguiente instruccin (goto
goto

s_b2

s_b2)

; de lo contrario (bit2=1)

; Aqui estamos porque bit2=0, pero como necesitamos negar el dato


; debido a la configuracin (de la unidad de despliegue) de nodo
; comn, entonces el bit2 deber ser "1".
bsf

PORTA,RA1

; DATA=1

goto

s_c2

; Ve a generar el pulso de reloj

s_b2
; Aqui estamos porque bit2=1, pero como necesitamos negar el dato
; debido a la configuracin (de la unidad de despliegue) de nodo
; comn, entonces el bit2 deber ser "0".
bcf

PORTA,RA1

; DATA=0

call

pulso_clk

; genera pulso de reloj (CLK)

s_c2
; Procesa el siguiente bit
; Bit 1:
btfsc Digito,bit1 ; Si bit1=0 entonces salta la
; siguiente instruccin (goto
goto

s_b1

s_b1)

; de lo contrario (bit1=1)

; Aqui estamos porque bit1=0, pero como necesitamos negar el dato


; debido a la configuracin (de la unidad de despliegue) de nodo
; comn, entonces el bit1 deber ser "1".
bsf

PORTA,RA1

; DATA=1

451

goto

s_c1

; Ve a generar el pulso de reloj

s_b1
; Aqui estamos porque bit1=1, pero como necesitamos negar el dato
; debido a la configuracin (de la unidad de despliegue) de nodo
; comn, entonces el bit1 deber ser "0".
bcf

PORTA,RA1

; DATA=0

call

pulso_clk

; genera pulso de reloj (CLK)

s_c1
; Procesa el siguiente bit
; Bit 0:
btfsc Digito,bit0 ; Si bit0=0 entonces salta la
; siguiente instruccin (goto
goto

s_b0

s_b0)

; de lo contrario (bit0=1)

; Aqui estamos porque bit0=0, pero como necesitamos negar el dato


; debido a la configuracin (de la unidad de despliegue) de nodo
; comn, entonces el bit0 deber ser "1".
bsf

PORTA,RA1

; DATA=1

goto

s_c0

; Ve a generar el pulso de reloj

s_b0
; Aqui estamos porque bit0=1, pero como necesitamos negar el dato
; debido a la configuracin (de la unidad de despliegue) de nodo
; comn, entonces el bit0 deber ser "0".
bcf

PORTA,RA1

; DATA=0

call

pulso_clk

; genera pulso de reloj (CLK)

s_c0
return
; Regreso de subrutina
; -------------------------------------------------------------------; ******************************************************
; Rutina de refresco de la unidad de despliegue
; ******************************************************
;
;
;
;
;
;
;
;
;

Esta rutina opera en conjunto con la rutina "timer_int", la cual


es la encargada de llevar el conteo del tiempo necesario para
realizar el refresco de la unidad de despliegue. En nuestro caso,
la rutina contar 8 interrupciones antes de encender el bit RFSH.
O sea, una interrupcin se ejecuta cada 250 microsegundos y
si se requiere contar 8 interrupciones, el tiempo total en
encender el bit RFSH ser de 2000 microsegundos. Es decir, el
refresco de la unidad de despliegue se ejecutar cada 2 milisegundos.

; Esta rutina pregunta primeramente si ya es tiempo de refrescar

452

; la unidad de despliegue. Esto ser indicado por el bit RFSH.


; Si RFSH=1 entonces refresca, de lo contrario no hagas nada,
; solo regresa.
refresca
btfss Flags,RFSH

; Si RFSH=1 entonces salta la


; siguiente instruccin (return)

return

; Regreso de subrutina

; Estamos aqui porque RFSH=1, lo que implica que es tiempo de


; refrescar la unidad de despliegue.
call

dis_int

;
;
;
;

Deshabilita interrupciones para


no interrumpir el proceso de
envio de informacin al registro
de corrimiento.

call

shift16

; Envia datos al registro de corrimiento.

bcf

Flags,RFSH

; RFSH=0 (apaga este bit de control, para


; esperar una nueva indicacin de refresco.

call

enb_int

; Habilita interrupciones nuevamente

return
; Regreso de subrutina
; -------------------------------------------------------------------; ***********************************************************
; Rutina de generacin de un tono para hacer sonar una bocina
; ***********************************************************
;
;
;
;
;

Esta rutina har un conteo regresivo del contador "c_tono" hasta


llegar a 0. Es decir, ejecutar las instrucciones que harn que
RB6=1, luego un retardo de 165 microsegundos, posteriormente har
RB6=0 y nuevamente un retardo de 165microsegundos. Esto hecho
durante 250 veces.

; Esto equivale a generar una seal cuadrada de 330 microsegundos de


; periodo (o sea, una frecuencia de 3000 Hz aproximadamente).
Gen_tono:
movlw .250
movwf c_tono
g_t0
bsf
PORTB,RB6

; W=250
; c_tono=W
; RB6=1 (activa la seal de salida "DIG_O")
; localizada en J2-2

call

refresca

; Refresca unidad de despliegue (si es tiempo

call

Delay_01s

; Retardo de 1 milisegundo aproximadamente

bcf

PORTB,RB6

; RB6=0 (desactiva la seal de salida "DIG_O")


; localizada en J2-2

de)

453

call

refresca

; Refresca unidad de despliegue (si es tiempo

call

Delay_01s

; Retardo de 1 milisegundo aproximadamente

de)
decfsz c_tono,f
goto

; c_tono=c_tono-1, salta la siguiente


; instruccin (goto g_t0) si c_tono=0

g_t0

return
; regreso de subrutina
; -------------------------------------------------------------------; ******************************************************
; Rutina de retardo de aproximadamente .01 segundos
; ******************************************************
;
;
;
;

Esta rutina har un conteo regresivo del contador c_tono_h.


Es decir, ejecutar la rutina 25 veces y al llegar a
cero dicho contador, saldra de la rutina, regresando de donde
fu llamada.

Delay_01s
movlw .25
movwf c_tono_h

; W=25
; c_tono_h=W

clrwdt

; Refresca temporizador de guardia (WDT)

d_y0
decfsz c_tono_h,f ; c_tono_h=c_tono_h-1, salta la siguiente
; instruccin (goto d_y0) si c_tono_h=0
goto

d_y0

return
; regreso de subrutina
; -------------------------------------------------------------------; ******************************************************
; Rutina de retardo de aproximadamente .25 segundos
; ******************************************************
;
;
;
;
;

Esta rutina har un conteo regresivo de los contadores "CountQs" y


"CountMs". Es decir, ejecutar la rutina "refresca" 250 veces
(CountMs) y al llegar a cero dicho contador, decrementar en uno el
contador "CountQs" y volver a inicializar el contador "CountMs" a
250.

Delay_25s
movlw .50
movwf CountQs

; W=50
; CountQsW

goto dl_0
; --------------------------------------------------------------------

454

; ******************************************************
; Rutina de retardo de aproximadamente 1 segundo
; ******************************************************
;
;
;
;
;

Esta rutina har un conteo regresivo de los contadores "CountQs" y


"CountMs". Es decir, ejecutar la rutina "refresca" 250 veces
(CountMs) y al llegar a cero dicho contador, decrementar en uno el
contador "CountQs" y volver a inicializar el contador "CountMs" a
250.

Delay_100s
;
;
;
;

Inicializa contador "CountQs" para un conteo de aproximadamente 200


veces la ejecucin de la rutina "refresca" (xxx ciclos de
instruccin) ms las instrucciones "clrwdt" (1 ciclo), "decf" (1
ciclo), "btfss" (1 ciclo) y "goto" (2 ciclos).
movlw .200
movwf CountQs

; W=200
; CountQsW

movlw .250
movwf CountMs

; W=250
; CountMs=W

call

; Refresca unidad de despliegue (si es tiempo


; de)

dl_0
dl_1
refresca

clrwdt

; Refresca temporizador de guardia (WDT)

decf

; CountMs=CountMs-1

CountMs,f

btfss STATUS,Z

; Si Z=1 entonces salta la siguiente


; instruccin

goto

dl_1

; continua contando

decf

CountQs,f

; CountQs=CountQs-1

btfss STATUS,Z

; Si Z=1 entonces salta la siguiente


; instruccin

goto

; continua contando

dl_0

return
; Regreso de subrutina
; -------------------------------------------------------------------; ******************************************************
; Rutina que desactiva el relevador de salida
; ******************************************************
relay_off
;
;
;
;

La salida de este bit controla la base del transistor NPN Q4,


por lo que si este bit se encuentra en "0", dicho transistor
estara apagado y en consecuencia el relevador de salida
se encontrara inactivo.

455

bcf

PORTB,RB7

; RB7=0 (Desactiva el relevador)

return
; Regreso de subrutina
; -------------------------------------------------------------------; ******************************************************
; Rutina que activa el relevador de salida
; ******************************************************
relay_on
;
;
;
;

La salida de este bit controla la base del transistor NPN Q4,


por lo que si este bit se encuentra en "1", dicho transistor
estara encendido y en consecuencia el relevador de salida
se encontrara activo.
bsf

PORTB,RB7

; RB7=1 (Activa el relevador)

return
; Regreso de subrutina
; -------------------------------------------------------------------; ******************************************************
; Rutina que enciende la lmpara verde
; ******************************************************
lamp_green
bsf
bcf

PORTB,RB0
PORTB,RB1

; RB0=1 (Enciende lmpara verde)


; RB1=0 (Apaga lmpara roja)

return
; Regreso de subrutina
; -------------------------------------------------------------------; ******************************************************
; Rutina que enciende la lmpara roja
; ******************************************************
lamp_red
bcf
bsf

PORTB,RB0
PORTB,RB1

; RB0=0 (Apaga lmpara verde)


; RB1=1 (Enciende lmpara roja)

return
; Regreso de subrutina
; -------------------------------------------------------------------; ******************************************************
; Rutina que enciende la lmpara amarilla
; ******************************************************
lamp_yellow
bsf
bsf

PORTB,RB0
PORTB,RB1

; RB0=1 (Enciende lmpara verde)


; RB1=1 (Enciende lmpara roja)

456

return
; Regreso de subrutina
; -------------------------------------------------------------------; ******************************************************
; Rutina que apaga la lmpara
; ******************************************************
lamp_off
bcf
bcf

PORTB,RB0
PORTB,RB1

; RB0=0 (Apaga lmpara verde)


; RB1=0 (Apaga lmpara roja)

return
; Regreso de subrutina
; -------------------------------------------------------------------; ****************************************************
; Rutina de servicio a interrupcin (solo para Timer0)
; ****************************************************
; Se estima que se entrar a esta rutina cada 100 microsegundos. El
; conteo del nmero de veces que se entra a esta rutina es llevado
; por la variable "Int_count".
;
;
;
;
;
;
;

Por lo tanto, se requerir de un conteo de 100 "Int_count" para


medir 10 milisegundos de tiempo. Es decir,
100 us X 100 conteos de "Int_count" = 10,000 us = 10 ms.
Existir otro contador que llevar el registro de 100 conteos de
10 milisegundos cada uno. A esta variable se le denominar
"Count_10ms". Con 100 conteos de la variable "Count_10ms" habr
transcurrido un tiempo de 1 segundo (100 x 10 ms = 1000 ms = 1 seg).

;
;
;
;
;
;
;
;

Esta rutina es la ecargada de darle servicio a interrupciones.


En este caso la nica fuente de interrupcin es el temporizador TMR0. Estando habilitadas las interrupciones y al
generarse una interrupcin, el control del contador de
programa (PC) ser transferido a la direccin del vector de
interrupciones (0x0004) en donde se encuentra la instruccin
"goto int". Despus de ejecutarse esta instruccin, el control
ser tranferido a esta rutina.

int
;
;
;
;
;

El proposito de las primeras instrucciones es salvar una serie de


registros que sern usados y en consecuencia modificados en la
ejecucin de esta rutina por lo que se debern salvar previamente,
y posteriormente re-establecer con sus valores originales antes de
salir de esta rutina.
movwf temp_w

; temp_W=W (Salva registro W)

; El registro STATUS esta formado por los siguientes bits de control:


; (d7..d0) IRP RP1 RP0 TO PD Z DC C
; Las instrucciones "swapf" y "movwf" no afectan ningn bit del

457

; registro STATUS
swapf STATUS,W

; (STATUS<3:0>) => (W<7:4>),


; (STATUS<7:4>) => (W<3:0>)

movwf temp_stat

; temp_stat=W (Salva el registro STATUS)

incf

Int_count,f ; Int_count=Int_count+1

bcf

INTCON,T0IF ;
;
;
;
;
;
;
;

Apaga el bit T0IF (bandera de sobreflujo


timer0)ya que deber estar en 0 para que la
prxima interrupcin pueda vuelver a
encenderse. Si este bit no se apagara, al
momento de salir de la rutina de servicio a
interrupcin, inmediatamente se generara
otro interrupcin por estar prendido este
bit.

;
;
;
;

Si consideramos que tenemos un oscilador de 4 MHz, cada ciclo de


instruccin equivaldr a 1000 nanosegundos (1 microsegundo), o sea,
Fosc/4 = 4 MHz/4 = 1.0 MHz por lo que el periodo ser T=1/F, T=1/1.0
MHz = 1.0 microsegundos.

;
;
;
;

Si cada ciclo de instruccin se realiza en 1.00 microsegundo y


considerando que la relacin del pre-escalador es X4, en realidad
cada conteo del temporizador TMR0se realizar cada 4.0 microsegundos
(1.0 us x 4 = 4.0 us).

;
;
;
;
;
;
;

Por consiguiente, si deseamos que cada interrupcin se genere cada


100 microsegundos (para facilidad de clculos), entonces necesitamos
escribir en el registro del temporizador TMR0 un nmero "X" tal que
cuando suceda la condicin de sobre-flujo (conteo de 0xFF a 00) este
haya contado los "N" ciclos necesarios. Es decir, el tiempo de
conteo ser igual a "N" ciclos de 4.0 microsegundos cada uno. As,
podemos calcular "N" con la siguiente frmula:

; Tiempo de conteo = N * 4.0 us


; El tiempo total transcurrido ser igual al tiempo de conteo ms el
; tiempo de ejecucin de la rutina de interrupcin antes que el
; temporizador TMR0 inicie nuevamente su conteo.
; Tiempo total = Tiempo de conteo + Tiempo de ejecucin
; El tiempo de ejecucin es de 11 ciclos de instruccin (11 * 4.0 us =
; 44.0 us).
; Por lo tanto:
; Tiempo de conteo = Tiempo total - Tiempo de ejecucin
; Tiempo de conteo = 100 us - 44.0 us = 66.0 us
; Substituyendo en la frmula anterior el Tiempo de conteo = N * 4.0
; us
; N * 4.0 us = 66.0 us, tenemos que N = 66.0 / 4.0 = 16.5

458

; N = 16.5, y redondeando al nmero entero ms prximo, tendremos que


; N = 17.
;
;
;
;

De esta manera podremos finalmente calcular el nmero "X" que se


deber escribir en el registro TMR0 para lograr que cada
interrupcin suceda cada 100 microsegundos. La frmula para obtener
"X" (valor a escribir en TMR0) es:

; Conteo total de TMR0 = X (valor inicial) + N (Conteo para generar


; una interrupcin)
; X = Conteo total de TMR0 - Conteo a realizar para generar
; interrupcin
; X = 256 - 17 = 239
;
;
;
;

Ya que si ponemos el registro TMR0 con un valor inicial de 239,


despus de contar 17 ciclos su conteo llegar a 00 y se generar la
interrupcin por deteccin de una condicin de sobre-flujo (0xFF a
0x00).

;
;
;
;

Ahora se deber escribir


que inicie nuevamente el
para que interrumpa otra
52 ciclos de instruccin

en el registro TMR0 del temporizador para


conteo del tiempo que deseamos que cuente
vez. En nuestro caso, deseamos que cuente
e interrumpa.

movlw .239

; W=239

movwf TMR0

; TMR0=W

; Hasta este momento tom 11 ciclos de instruccin despus de haberse


; generado la interrupcin. A partir de este momento el temporizador
; TMR0 inicia su conteo para generar una nueva interrupcin.
call

int_refresca ; Actualiza contadores de refresco de la


; unidad de despliegue.

call

int_tiempo

; Actualiza contadores de tiempo.

; Regresa los valores de los registros STATUS y W que fueron salvados


; al inicio de esta rutina.
swapf temp_stat,w ; (temp_stat<3:0>) => (W<7:4>),
; (temp_stat<7:4>) => (W<3:0>)
movwf STATUS

; STATUS=W
; Realmacena registro STATUS

swapf temp_w,f

; (temp_w<3:0>) => (temp_w<7:4>),


; (temp_w<7:4>) => (temp_w<3:0>)

; Debido a que la instruccin "swapf" intercambia los bits 3:0 con los
; bits 7:4ser necesario volver a intercambiarlos para no alterar el
; dato y depositarlo en el registro W.
swapf temp_w,w

; (temp_w<3:0>) => (temp_w<7:4>),

459

; (temp_w<7:4>) => (temp_w<3:0>)


; intercambia bits 0-3 <=> 4-7 de temp_w otra
; vez para mantenerlo sin cambio.
; En este momento, el registro STATUS y el registro W se encuentran
; exactamente igual que al inicio de esta rutina.
retfie

; Regreso de interrucpin (enciende nuevamente


; el bit GIE del registro INTCON, habilitando
; nuevamente las interrupciones).
; -------------------------------------------------------------------; ******************************************************
; Rutina de actualizacin de contadores de refresco
; ******************************************************
;
;
;
;

Esta rutina lleva el conteo del tiempo transcurrido desde la ltima


vez que fu refrescada la unidad de despliegue y enciende un bit de
control (RFSH) que indica cuando es necesario volver a refrescar
dicha unidad.

; Asimismo, lleva el control de los contadores de tiempo que permiten


; registrar el conteo de cada segundo de tiempo.
int_refresca
; En realidad este conteo es un conteo regresivo hasta llegar a cero.
decf

;
;
;
;

CntMs_int,f ; CntMs_int=CntMs_int-1

btfss STATUS,Z

; Si Z=1 entonces salta la siguiente


; instruccin (return)

return

; Regreso de subrutina

Hemos llegado aqui porque el contador CntMs_int llego a cero (Z=1),


lo que implica que deber encenderse el bit de control (RFSH) que
indica el momento que ser necesario volver a refrescar dicha
unidad.
movlw .8

;
;
;
;
;
;
;

movwf CntMs_int

; CntMs_int=W

bsf

;
;
;
;

Flags,RFSH

return

Reinicia el contador a 8 porque deseamos


que cada 2000 microsegundos aproximadamente
(8 * 250 us de cada interrupcin = 2000 us)
sea resfrescada la mitad de la unidad de
despliegue, es decir, los dgitos nones
(U1,U3) o los dgitos pares (U2,U4), segn
corresponda.

Enciende el bit RFSH, indicando as que ser


necesario refrescar los dgitos (pares o
nones)correspondientes (indicado por el bit
NONES).

; Regreso de subrutina

460

; -------------------------------------------------------------------; ******************************************************
; Rutina de actualizacin de contadores de tiempo
; ******************************************************
; Esta rutina lleva el control de los contadores de tiempo que
; permiten registrar el conteo de cada segundo de tiempo.
; El contador base es la variable "Int_count" que registra la
; occurencia de cada interrupcin que es de aproximadamente 250 us.
; La variable "Count_10ms" es la encargada de llevar el conteo de la
; ocurrencia de bloques de 100 conteos de la variable "Int_count".
; 10 ms = 100 conteos de 250 us cada uno = 100 x 250 us = 25,000 us.
; 25 ms = 40 conteos de "Int_count".
; 1 seg = 40 conteos de 25 ms cada uno = 40 x 25 ms = 1000 ms.
int_tiempo
; Verifica que la variable "Int_count" haya registrado 47 conteos.
movf

Int_count,w ; W=Int_count

; Este dato resulto del ajuste realizado por prueba y error para
; lograr un efecto ms preciso en el reloj.
sublw .47

; W=47-W
; Si el resultado de W=0 entonces Z=1, lo
; que implicar que Int_count=47.

btfss STATUS,Z

; Si Z=1 salta la siguiente instruccin


; (return) para incrementar la variable
; "Count_10ms".

return

; Esta instruccin sera ejecutada solo


; cuando temp=0, entonces regresa de subrutina

; Si hemos llegado aqui implica que Int_count=47, por lo que deber


; incrementarse la variable "Count_10ms" y hacer Int_count=0 para que
; inicie nuevamente su conteo.
clrf

Int_count

; Int_count=0

; El siguiente es un ajustador de tiempo para realizar ajustes finos


; al reloj. Si se incrementa el nmero en la siguiente instruccin,
; retardar el reloj. En caso contrario, lo adelantar.
movlw .31
movwf temp

; W=31 (nmero de ajuste fino)


; temp=W

i_t0
nop
nop
nop

461

nop
decfsz temp,f
goto

i_t0

; temp=temp-1, y cuando temp=0 salta la


; siguiente instruccin (goto i_t0)
; regresa a continuar con la malla (loop)

; Aqui termina el ajustador fino.


incf

Count_10ms,f ; Count_10ms=Count_10ms+1

; Verifica que la variable "Count_10ms" haya registrado 100 conteos.


movf

Count_10ms,w ; W=Count_10ms

sublw .100

; W=100-W
; Si el resultado de W=0 entonces Z=1, lo
; que implicar que Count_10ms=100.

btfss STATUS,Z

; Si Z=1 salta la siguiente instruccin


; (return) para incrementar la variable
; "Count_10ms".

return

; Si Z=0 entonces regresa de subrutina

; Si hemos llegado aqui implica que Count_10ms=100, por lo que deber


; incrementarse la variable "c_seg_u" y hacer Count_10ms=0 para que
; inicie nuevamente su conteo.
clrf

Count_10ms

; Count_10ms=0

incf

c_seg_u,f

; c_seg_u=c_seg_u+1

movf

c_seg_u,w

; W=c_seg_u

sublw .10

; W=10-W
; Si el resultado de W=0 entonces Z=1, lo
; que implicar que c_seg_u=10.

btfss STATUS,Z

; Si Z=1 salta la siguiente instruccin


; (return) para incrementar la variable
; "c_seg_d".

return

; Si Z=0 entonces regresa de subrutina

; Si hemos llegado aqui implica que cont_seg_u=10, por lo que deber


; incrementarse la variable "c_seg_d" y hacer c_seg_u=0 para que
; inicie nuevamente su conteo.
clrf

c_seg_u

; c_seg_u=0

incf

c_seg_d,f

; c_seg_d=c_seg_d+1

return
; regreso de subrutina
; -------------------------------------------------------------------; ******************************************************

462

; Rutina de lectura de los botones (PB1, PB2, PB3 y PB4)


; ******************************************************
;
;
;
;

Esta rutina nos permite detectar si uno o varios botones (PB) se


encuentran oprimidos. Los botones se encuentran conectados
directamente al puerto PORTB con una resistencia "pull-up" cada
botn.

;
;
;
;

RB2
RB3
RB4
RB5

=
=
=
=

PB1
PB2
PB3
PB4

(0=push
(0=push
(0=push
(0=push

button
button
button
button

oprimido)
oprimido)
oprimido)
oprimido)

Lee_PB
; Inicializa la variable "Push_button" que contendr la informacin
; acerca del estado que guardan los cuatro botones (push buttons):
; PB1, PB2, PB3 y PB4.
; (d7..d0)

"Push_button"

PB4

PB3

PB2

PB1

; donde el bit PBx indica el estado del botn "x".


; Si PBx=1, el botn se encuentra oprimido.
clrf

Push_button ; Push_button=0
; Ningn botn se encuentra oprimido.

; Lee el botn PB1 (MODO)


btfss PORTB,RB2

; Si RB2=1 (sin oprimir) entonces salta la


; siguiente instruccin (bsf ..).

; Hemos llegado aqui porque el botn PB1 se encontr oprimido.


bsf

Push_button,PB1 ; PB1=1, indica que PB1 se encontr


; oprimido.

; Lee el botn PB2 (ENTER)


btfss PORTB,RB3

; Si RB3=1 (sin oprimir) entonces salta la


; siguiente instruccin (bsf ..).

; Hemos llegado aqui porque el botn PB2 se encontr oprimido.


bsf

Push_button,PB2 ; PB2=1, indica que PB2 se encontr


; oprimido.

; Lee el botn PB3 (PREVIO)


btfss PORTB,RB4

; Si RB3=1 (sin oprimir) entonces salta la


; siguiente instruccin (bsf ..).

; Hemos llegado aqui porque el botn PB3 se encontr oprimido.


bsf

Push_button,PB3 ; PB3=1, indica que PB3 se encontr


; oprimido.

463

; Lee el botn PB4 (SIGUIENTE)


btfss PORTB,RB5

; Si RB5=1 (sin oprimir) entonces salta la


; siguiente instruccin (bsf ..).

; Hemos llegado aqui porque el botn PB4 se encontr oprimido.


bsf

Push_button,PB4 ; PB4=1, indica que PB4 se encontr


; oprimido.

return
; Regreso de subrutina
; -------------------------------------------------------------------; La siguiente directiva indica que este es el fin del cdigo del
; programa
end
; Fin del programa de aplicacin
; --------------------------------------------------------------------

464

29

Diagrma esquematico

El captulo anterior present la explicacin de un proyecto desarrollado para ilustrar una de las
tantas aplicaciones en las que pudiera estar involucrado un microcontrolador PIC. En este
captulo se presentarn, tanto la lista de partes del circuito que integra el proyecto como su
diagrma esquemtico y mecnico.
Lista de partes
Con la finalidad de facilitar la identificcin de cada una de las partes y no exista lugar a dudas
de la parte que se trata y donde poder adquirirla, en la presente lista de partes se har
referencia al nmero de cdigo del catlogo de la empresa STEREN, lider en componentes
electrnicos en el pas.
No.
Parte

Cdigo
Comercial

Descripcin

Cdigo
STEREN

U1-U4
U5,U6
U7
U7
U8
X1
L1
Q1,Q2
Q3,Q4
D1
D2
K1
J1
C1,C2
C3-C5
R1-R16
R21-R23
R17-R19
R28,R29
R20,R21
R24-R27
R30
PB1-PB4
PCB1
PS1

DA03
MC14094B
PIC16F84A
IC18P
MC7805CT
XTAL 4.00 MHz
LED BICOLOR
BC557B
BC547B
1N4005
1N4148
RAS-0510
Conector inv.
Cap. 33pf
Cap. 0.01uf
Res. 330, .25W
Res. 330, .25W
Res.1K,.25W
Res.1K,.25W
Res.10K,.25W
Res.10K,.25W
Res.10K,.25W
Push Button
PCB
ELI-050

Display 7 seg. nodo comn


Registro de corrimiento (8 bits)
Microcontrolador PIC (18 pines)
Base para CI de 18 pines
Regulador de voltaje +5V-1A
Cristal de cuarzo 4.00 MHz
Led bicolor (rojo/verde)
Transistor PNP
Transistor NPN
Diodo rectificador
Diodo de seal
Relevador 5VDC
Conector alimentacin VDC
Capacitor ceram. de disco 33 pf
Capacitor ceram. de disco .01uf
Resistencia 330 ohms, 1/4W
Resistencia 330 ohms, 1/4W
Resistencia 1Kohms, 1/4W
Resistencia 1Kohms, 1/4W
Resistencia 10Kohms, 1/4W
Resistencia 10Kohms, 1/4W
Resistencia 10Kohms, 1/4W
Interruptor de empuje
Placa fenlica perforada c/cobre
Eliminador de baterias

DA03
MC14094B
PIC16F84A-04P
IC18P
MC7805CT
C4.0
5/BICOLOR
BC557-B
BC547-B
1N4005
1N4148
RAS-0510
250-687
C33-500
C.01-50
R330 1/4
R330 1/4
R1K 1/4
R1K 1/4
R10K 1/4
R10K 1/4
R10K 1/4
AU-101
150CC
ELI-050

465

466

467

Diagrma mecnico de la tarjeta TD-PIC-1


468

Fotografa del prototipo de la tarjeta del proyecto.

469

You might also like