Professional Documents
Culture Documents
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.
Generalidades
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.
(Ejemplo: 12Cxxx)
(Ejemplo: 12CRxxx)
(Ejemplo: 16Fxxx)
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.
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
XT
Cristal/Resonador
(Crystal/Resonator)
HS
RC
Resistencia/Capacitor externos
(External Resistor/Capacitor)
EXTRC
Resistencia/Capacitor externos
(External Resistor/Capacitor)
EXTRC
INTRC
INTRC
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.
Ganancia
Comentario
11
RC
---
Solucin ms econmica
(Solo un capacitor y una
resistencia externas).
10
HC
Alta
01
XT
Media
00
LP
Baja
10
Tabla 3.2:
FOSC2:FOSC0
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
---
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
001
XT
Media
000
LP
Baja
11
Figura 3.1:
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
13
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
15
Figura 3.5
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
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:
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
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
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
19
Figura 3.10
Nota 1:
Nota 2:
20
21
22
Arranque (RESET)
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
24
Figura 4.2
25
Figura 4.4
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
27
Figura 4.8 Tiempo de subida del voltaje de alimentacin lento (MCLR conectado a VDD)
28
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
Figura 4.11
30
Tabla 4.2
Tabla 4.3
31
32
33
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 1
bit 0
34
Nota:
R = bit de lectura
W = bit de escritura
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
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
bit 3
bit 2
bit 1
bit 0
Nota:
Para prstamo (borrow) la polaridad es invertida. Una resta es ejecutada por sumar el
35
R = bit de lectura
W = bit de escritura
36
Arquitectura
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
38
39
Figura 5.2
40
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
42
Tabla 5.1
43
44
(Continuacin)
Tabla 5.1
45
(Continuacin)
46
(Continuacin)
47
(Continuacin)
48
CPU y ALU
49
50
51
Q1:
Q2:
Q3:
Q4:
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:
Nota 2:
Registro STATUS
53
bit7
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
bit 3
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
bit 0
Nota:
54
Registro OPTION_REG
bit 7
bit 6
bit 5
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
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).
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
Registro PCON
bit 7
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
bit 0
56
Organizacin de Memoria
57
Figura 7.1
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.
59
Figura 7.2
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
61
62
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
65
Figura 7.5
66
Figura 7.6
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
71
bit 3
bit 1
bit 0
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
73
Escritura y verificacin
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:
Existe un solo registro usado para el control y el estado de las interrupciones. Este registro es:
INTCON
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:
79
Registro INTCON
bit 7
bit 6
bit 5
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
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
(1)
RBIF
(1)
R = Bit de lectura
W = Bit de escritura
U = Bit no implementado, ledo como 0
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
bit
bit
bit
bit
bit
bit
81
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
bit
bit
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
R = Bit de lectura
W = Bit de escritura
U = Bit no implementado, ledo como 0
Nota 1:
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:
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
bit
bit
bit
83
En modo PWM:
No usado en este modo
bit
bit
bit
bit
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
bit
bit
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
84
R = Bit de lectura
W = Bit de escritura
U = Bit no implementado, ledo como 0
Nota 1:
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
85
Nota:
Cualquier interrupcin causada por una seal externa (tales como temporizadores,
captura, cambio de estado en un puerto) tendrn similares tiempos.
86
2.
3.
4.
5.
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
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.
87
Ejemplo 9.2
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.
88
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
Ejemplo 9.6
90
Ejemplo 9.7
91
92
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
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:
94
Nota 3:
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:
95
Figura 10.2
96
Figura 10.3
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
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
99
Figura 10.6 Diagrma de bloques del PORTC (Perifrico con dominancia en la salida)
100
Figura 10.7
101
Figura 10.8
Nota:
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.
102
Figura 10.9
103
Figura 10.9
104
Figura 10.11
105
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
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
108
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:
Nota 2:
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
Registro de control
Registro TRISE
bit 7
bit 6
bit 5
110
bit 3
bit 2
bit 1
bit 0
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:
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.
112
Figura 11.2
Figura 11.3
113
114
12
Temporizador Timer0
La figura 12.1 muestra un diagrma de bloques simplificado del mdulo del temporizador
Timer0.
Figura 12.1
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
bit 6
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
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
Figura 12.3
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
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
119
Figura 12.6
120
WDT)
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
122
13
Temporizador Timer1
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
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
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
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
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
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:
128
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
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
130
Ejemplo 13.5
Ejemplo 13.6
131
132
14
Temporizador Timer2
bit 7
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
:
:
bit 2
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
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:
Inicializacin
El ejemplo 14.1 muestra como inicializar el mdulo Timer2, incluyendo especificar el preescalador y el post-escalador.
135
136
15 Compara/Captura/PWM (CCP)
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
W = Bit de escritura
138
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:
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
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
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:
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:
141
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.
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:
La figura 15.3 muestra un diagrma de bloques simplificado del mdulo CCP para operar como
PWM.
Figura 15.3
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:
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
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
146
147
148
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:
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
149
bit 3
bit 2
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
bit 0
BF: Bit del estado de memoria (buffer) completa (Buffer Full Status)
2
bit 7
bit 6
150
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
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:
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:
La figura 16.1 muestra el diagrma de bloques del mdulo SSP cuando se encuentra en modo
SPI.
152
Figura 16.1
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:
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:
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
156
Figura 16.4 Formas de onda en modo SPI, modo esclavo (con CKE = 0)
157
Figura 16.5
Figura 16.6
158
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
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
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:
Tabla 16.2
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.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
165
166
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:
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
Inicializacin
Ejemplo 16.2 Inicializacin en el modo SPI maestro
168
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 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
bit 6
bit 5
bit 4
171
bit 1
bit 0
bit 7
bit 6
bit 5
bit 4
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
bit 1
bit 0
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
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
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
174
Tabla 17.3
Tabla 17.4
175
Tabla 17.5
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:
Nota 2:
177
Tabla 17.6
178
179
Figura 17.4
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
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
181
Figura 17.8
Figura 17.9
Tabla 17.7
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:
Nota 2:
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
Figura 17.10
Transmisin sincrnica
184
Figura 17.11
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
186
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
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.
188
189
190
18
Referencia de voltaje
191
Tabla 18.1
Registro de control
Registro VRCON
bit 7
bit 6
bit 5
bit 4
192
R = Bit de lectura
W = Bit de escritura
U = Bit no implementado, ledo como 0
Si VRR = 0:
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
Inicializacin
El ejemplo 18.1 muestra los pasos para configurar el mdulo de referencia de voltaje.
194
195
196
19
Comparador
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)
conecta a AN3
0 = C1
conecta a AN0
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
198
199
Comparador sencillo
200
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
202
203
Tabla 19.1
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
204
20
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:
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
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.
bit 1
bit 0
Registro ADCON1
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
Nota 1:
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
209
El ejemplo 20.1 muestra el clculo del tiempo de adquisicin mnimo requerido TACQ. Este
clculo esta basado asumiendo lo siguiente:
Ejemplo 20.1
Nota 1:
Nota 2:
Nota 3:
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
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
211
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:
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:
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
Figura 20.4
213
Figura 20.5
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
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.
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
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
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
bit 6
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
bit 3
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:
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
Para cambiar el pre-escalador del temporizador WDT al mdulo Timer0 utilice la secuencia
mostrada en el ejemplo 21.2
221
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:
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:
223
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
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:
Nota 2:
225
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:
Nota 2:
226
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
229
230
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:
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
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:
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.
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
237
Figura 23.2
238
239
Nota 2:
del
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
242
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
243
244
245
246
Tabla 23.3
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:
247
Tabla 23.4
248
249
250
24
Conjunto de Instrucciones
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:
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:
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
253
Tabla 24.2
254
Leer PC:
PCL
Escribir en PCL:
PCLATCH
PCH
Valor de 8 bits del destino
Leer-Modificar-Escribir: PCL
dest
PCLATCH no cambia
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.
255
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
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
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 >)
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
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
298
Archivos de entrada:
Cdigo fuente (Source Code) (.asm)
Archivos de salida:
Archivo de listado (Listing File) (.lst)
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:
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:
Macro directivas
Existen directivas que son nicas a las Macro definiciones. stas no podrn ser usadas fuera
del contexto del Macro.
Nota:
ENSAMBLADO CONDICIONAL
ELSE
ENDIF
ENDW
IF
IFDEF
IFNDEF
WHILE
else
endif
endw
if <expr>
ifdef<etiqueta>
ifndef <etiqueta>
while <expr>
DATA
__BADRAM
CBLOCK
__CONFIG
DA
300
_ _badram <expr>
cblock <expr>
_ _config <expr> OR
_ _config <addr>, <expr>
[<etiqueta>] da <expr> [,
<expr2>,..., <exprn> ]
DATA
DB
DE
DT
Define tabla
DW
ENDC
FILL
__IDLOCS
__MAXRAM
RES
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>
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>
#v (<expr>)
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
dw
dw
dw
dw
0
0
0
0
302
A continuacin se presentan en forma detallada y con ejemplos, todas y cada una de las
directivas de Macros.
<etiqueta>
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
constant
BufLength = 512
constant
[<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))
303
p=17c42
:
:
; cdigo ejecutable
end
equ
<expr>
Descripcin
El valor de <expr> es asignado a <label>.
Ejemplo
four
equ
<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
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_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>
305
<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
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
org
int_1 + 0x10
<processor_type>
Descripcin
Pone el tipo de procesador a <processor_type>.
Ejemplo
processor
16C54
306
<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
B00111001
ASCII
A<caracter>
<caracter>
AC
C
Ejemplo
radix
dec
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
longitud 20
longitud
macro rate
if rate < 50
dw slow
308
else
endm
endif
dw fast
309
else
endif
movlw
movwf
0x0A
io_2
endif
prueba 1
; Enciende prueba
prueba
; Apaga prueba
prueba
310
macro
count
variable
while
movlw
i < count
i
endw
endm
start
test_mac
end
Badram es precedido de dos caracteres underline, sin ningn espacio entre ellos.
Aqu se agreg un espacio para fines de clarificar.
311
0x20
nombre_1, nombre_2
nombre_3, nombre_4
; a nombre_2, asignado 21
; a nombre_4, asignado 23
endc
CONFIG es precedido de dos caracteres underline, sin ningn espacio entre ellos.
Aqu se agreg un espacio para fines de clarificar.
_ _config <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
da
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
data
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
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
db
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
de
Mi programa, v1.0,0
DT (Define tabla)
<etiqueta>
dt
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
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
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
fill
315
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 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
316
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
[<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
318
<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
arg1, 0
arg2
endm
macro filereg
if
else
endm
endif
filereg == 1
exitm
319
<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
[<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
<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
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
[<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:
H01FF
goto
START
<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
Funcin
Funcin
<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
[<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
idata
dw
dw
dw
db
db
0
D300
D5
0
Hola, que tal
<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
[<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:
1
2
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:
1
2
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:
udata_ovr
res
1
res
1
res
1
Temps
LongTemp1
udata_ovr
res
2
LongTemp2
res
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:
udata_shr
res
1
res
1
res
1
326
26
Encadenador MPLINK
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.
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.
Nota:
Archivos de salida
Archivo COFF (.out)
Archivo de smbolos y
depuracin (.cod)
328
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.
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
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:
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
Cdigo (code)
Datos inicializados (idata)
Datos no inicializados (udata)
Datos de ROM inicializados (romdata)
331
Absoluta asignada
Absoluta sin asignar
Relocalizable asignada
Relocalizable no asignada
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
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.
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 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.
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
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:
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
341
Las propiedades del nodo no podrn ser cambiadas en los archivos objeto, una vez
que stos han sido ensamblados o compilados.
Las propiedades del nodo no podrn ser cambiadas en los archivos de librera, una vez
que stos han sido ensamblados o compilados.
342
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
344
Agregar un smbolo a la
ventana de observacin
Cambiar el formato de
despliegue de los smbolos
Salvar la ventana de
observacin
345
New
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
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
Export
Exporta
Seleccione File > Export para salvar la memoria de trazo (trace buffer)
o archivo .hex.
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.
348
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:
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
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
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:
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
355
start
loop
org
0x00
goto
start
org
0x04
movlw 0x09
movwf c1
incfsz c1,F
goto
loop
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
356
Delete
Open
Save
Help
Close
357
358
28
Proyecto
359
360
361
Tabla 28.1
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:
362
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
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
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
U3
U2
U1
366
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
367
=>
=>
=>
=>
(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
369
RB1
RB0
0
0
1
1
0
1
0
1
Apagado
Verde
Rojo
mbar
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
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
SI
SI
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
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)
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)
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)
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
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
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
mp_3x
380
NO
Subrutina
Refresca
Subrutina
Shift16
RFSH = 1?
NONES = 1?
NO
sh_pares
SI
Deshabilita
interrupciones
SI
Digito = Dig_1
Digito = Dig_2
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
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)
DATA = 1
(Puerto RA1)
s_b2
DATA = 0
(Puerto RA1)
s_b5
DATA = 0
(Puerto RA1)
bit4 = 1?
(de Digito)
SI
DATA = 1
(Puerto RA1)
NO
bit2 = 1?
(de Digito)
DATA = 1
(Puerto RA1)
bit5 = 1?
(de Digito)
s_b3
DATA = 1
(Puerto RA1)
NO
SI
DATA = 1
(Puerto RA1)
NO
bit3 = 1?
(de Digito)
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
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
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
385
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
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)
386
;
;
;
;
;
;
;
;
;
;
; ------------------------------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
;
;
;
;
;
;
;
;
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
w
f
False
True
equ
equ
equ
equ
.0
.1
.0
.1
388
RA0
RA1
RA2
equ
equ
equ
.0
.1
.2
RA3
equ
.3
RA4
equ
.4
;
;
;
;
;
;
;
;
equ
equ
.0
.1
RB2
RB3
RB4
RB5
RB6
RB7
equ
equ
equ
equ
equ
equ
.2
.3
.4
.5
.6
.7
;
;
;
;
;
;
;
;
;
equ
equ
equ
equ
equ
equ
equ
.0
.1
.2
.3
.4
.5
.6
;
;
;
;
;
;
;
equ
equ
equ
.0
.1
.2
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)
equ
equ
equ
equ
equ
equ
equ
equ
.0
.1
.2
.3
.4
.5
.6
.7
Modo
equ
.1
389
Enter
Previo
Siguiente
equ
equ
equ
.2
.4
.8
(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.
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------------------------------;
;
;
;
;
0x00
goto
start
0x04
; Vector de Interrupcin
goto
int
391
0x08
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
; -------------- 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
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)
392
movwf TRISB
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
(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
STATUS,RP0
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
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
call
call
call
call
;
;
;
;
rpt_dig
enb_int
Delay_100s
Delay_100s
394
call
call
rpt_dig
Delay_100s
chr_H
Dig_4
chr_0
Dig_3
chr_L
Dig_2
chr_A
Dig_1
; H
; O
; L
; A
call
refresca
call
Lee_PB
;
;
;
;
;
Push_button,w ; W=Push_button
395
goto
m_1
Push_button,w ; W=Push_button
; W=W . Modo
; MODO (PB1)
goto
m_modo
Push_button,w ; W=Push_button
; W=W . Enter
; ENTER (PB2)
;
;
;
;
;
btfss STATUS,Z
goto
m_enter
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
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
Push_count,w ; W=Push_count
sublw .1
;
;
;
;
;
;
;
;
goto
m_m_2
Push_count,w ; W=Push_count
sublw .2
;
;
;
;
397
;
;
;
;
goto
m_m_3
Push_count,w ; W=Push_count
sublw .3
;
;
;
;
;
;
;
;
goto
m_m_4
; 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
ref_pb
Push_button,w ; W=Push_button
goto
m_1x
call
Delay_25s
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
;
;
;
;
399
btfsc STATUS,Z
;
;
;
;
goto
m_reloj
Push_count,w ; W=Push_count
; Push_count=2?
sublw .2
;
;
;
;
;
;
;
;
goto
m_contador
Push_count,w ; W=Push_count
; Push_count=3?
sublw .3
;
;
;
;
goto
goto
m_1
400
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
m_reloj
call
modo_reloj
goto m_1
; Regresa al inicio de la malla principal.
; -------------------------------------------------------------------; *****************
; Funcin CONTADOR
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
m_contador
call
401
goto m_1
; Regresa al inicio de la malla principal.
; -------------------------------------------------------------------; ********************
; Funcin PROGRAMARR
; Esta funcin nos permite programar los parmetros del sistema tales
; como:
;
;
;
;
;
("trLJ")
la alarma : hh.mm ("tAon")
de la alarma: hh.mm ("tAoF")
Habilitada ("ALon") o Deshabilitada
402
m_m_1
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
Push_button,w ; W=Push_button
403
goto
mr_1
c_seg_d
c_seg_u
; c_seg_d=0
; c_seg_u=0
call
lamp_red
btfsc Flags,AL_ON ;
;
;
;
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
ref_pb
;
;
;
;
404
Push_button,w ; W=Push_button
;
;
;
;
;
btfsc STATUS,Z
goto
rj_0
Push_button,w ; W=Push_button
; W=W . Modo
; MODO (PB1)
goto
rj_x
Push_button,w ; W=Push_button
; W=W . Enter
; ENTER (PB2)
call
relay_off
405
;
;
;
;
;
;
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.
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.
;
;
;
;
;
;
goto
m_r0
c_seg_d
c_seg_u
; c_seg_d=0
; c_seg_u=0
c_min_u,f
; c_min_u=c_min_u+1
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.
;
;
;
;
goto
;
;
;
;
rj_1
c_min_u
; c_min_u=0
c_min_d,f
; c_min_d=c_min_d+1
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.
;
;
;
;
goto
;
;
;
;
rj_1
c_min_d
; c_min_d=0
c_hrs_u,f
; c_hrs_u=c_hrs_u+1
407
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.
;
;
;
;
goto
rj_2
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.
;
;
;
;
goto
;
;
;
;
rj_1
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
408
; 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
;
;
;
;
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
;
;
;
;
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
; Dig_4=W
; (En Dig_4 se encuentra el caracter a
; desplegar en el dgito U4 de la unidad de
; despliegue)
m_r0
409
btfsc Flags,RELAY ;
;
;
;
;
goto
rj_4
;
;
;
;
c_hrs_d,w
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.
;
;
;
;
goto
m_r0
movf
c_hrs_u,w
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.
;
;
;
;
goto
m_r0
movf
c_min_d,w
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
;
;
;
;
goto
m_r0
movf
c_min_u,w
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.
;
;
;
;
goto
m_r0
goto
m_r1
call
call
relay_on
lamp_green
;
;
;
;
bsf
m_r0
lamp_red
goto
m_r0
411
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.
;
;
;
;
goto
;
;
;
;
rj_1
c_hrs_u
; c_hrs_u=0
c_hrs_d,f
; c_hrs_d=c_hrs_d+1
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.
goto
rj_3
goto
rj_1
412
c_hrs_d,w
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.
;
;
;
;
goto
m_r0
movf
c_hrs_u,w
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.
;
;
;
;
goto
m_r0
movf
c_min_d,w
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.
;
;
;
;
goto
m_r0
413
movf
c_min_u,w
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.
;
;
;
;
goto
m_r0
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,
m_r0
relay_off
lamp_off
bcf
return
; Regreso de subrutina
; -------------------------------------------------------------------; ******************************************************
; Rutina que ejecuta la funcin de CONTADOR
; ******************************************************
;
;
;
;
;
modo_contador
414
ct_enter_c
call
ref_pb
m_c0
;
;
;
;
Push_button,w ; W=Push_button
goto
ct_0_c
Push_button,w ; W=Push_button
; W=W . Modo
; MODO (PB1)
goto
ct_x_c
Push_button,w ; W=Push_button
415
; W=W . Enter
; ENTER (PB2)
goto
ct_enter_c
Push_button,w ; W=Push_button
; W=W . Siguiente
; SIGUIENTE (PB4)
goto
ct_sig_c
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
goto
ct_3_c
; 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
goto
ct_3_c
; W=9
; cont_d=W
decf cont_c,f
movf cont_c,w
sublw 0xFF
;
;
;
;
btfss STATUS,Z
goto
ct_3_c
cont_c=cont_c-1
W=cont_c
W=0xFF-W
Si Z=1 implicar que cont_c=-1
; 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
goto
ct_3_c
; W=9
; cont_um=W
417
goto
ct_3_c
cont_um
cont_c
cont_d
cont_u
;
;
;
;
cont_um=0
cont_c=0
cont_d=0
cont_u=0
ct_3_c
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
ct_2_c
goto
ct_2_c
; W=10
; Counter=W
;
;
;
;
418
goto
ct_1_c
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
goto
ct_3_c
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
goto
ct_3_c
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
goto
ct_3_c
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
goto
ct_3_c
cont_um
; cont_um=0
cont_um,w
; W=cont_um
call
conv_chr
movwf Dig_4
; Dig_4=W
movf
cont_c,w
; W=cont_c
call
conv_chr
movwf Dig_3
; Dig_3=W
movf
cont_d,w
; W=cont_d
call
conv_chr
movwf Dig_2
; Dig_2=W
movf
; W=cont_u
cont_u,w
420
call
conv_chr
movwf Dig_1
; Dig_1=W
call
call
lamp_red
Gen_tono
call
lamp_off
;
;
;
;
goto
m_c0
Push_count
; Push_count=0
goto
mp_sig
m_p0
clrwdt
call
refresca
call
Lee_PB
;
;
;
;
;
Push_button,w ; W=Push_button
421
goto
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.
;
;
;
;
Push_button,w ; W=Push_button
; W=W . Modo
; MODO (PB1)
goto
mp_2x
Push_button,w ; W=Push_button
; W=W . Enter
; ENTER (PB2)
goto
mp_enter
Push_button,w ; W=Push_button
422
; W=W . Siguiente
; SIGUIENTE (PB4)
;
;
;
;
;
btfss STATUS,Z
goto
mp_sig
goto m_p0
; regresa al inicio de la malla (loop)
; -------------------------------------------------------------------;
;
;
;
;
;
;
;
;
;
;
;
;
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,f ; Push_count=Push_count+1
Push_count,w ; W=Push_count
sublw .6
;
;
;
;
;
423
btfsc STATUS,Z
;
;
;
;
goto
m_p_1
Push_count,w ; W=Push_count
sublw .1
;
;
;
;
;
;
;
;
goto
m_p_2
Push_count,w ; W=Push_count
sublw .2
;
;
;
;
;
;
;
;
goto
m_p_3
Push_count,w ; W=Push_count
sublw .3
;
;
;
;
424
btfsc STATUS,Z
;
;
;
;
goto
m_p_4
Push_count,w ; W=Push_count
sublw .4
;
;
;
;
;
;
;
;
goto
m_p_5
; 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
dec_point1
goto mp_1x
; -------------------------------------------------------------------; Despliega que el men esta por seleccionar el parmetro "ALon"
m_p_6
call
disp_ALon
dec_point1
; -------------------------------------------------------------------mp_1x
; Espera a que dejen de oprimir el botn
call
ref_pb
Push_button,w ; W=Push_button
goto
mp_1x
call
Delay_25s
goto
m_p0
426
mp_2x
bcf
bcf
bcf
call
return
Push_count,w ; W=Push_count
sublw .1
implicar
; que el men esta en la opcin de "trLJ"
; Probemos el bit Z del registro STATUS
btfsc STATUS,Z
;
;
;
;
goto
m_s_1
Push_count,w ; W=Push_count
sublw .2
;
;
;
;
;
;
;
;
goto
m_s_2
Push_count,w ; W=Push_count
427
sublw .3
;
;
;
;
;
;
;
;
goto
m_s_3
Push_count,w ; W=Push_count
sublw .4
;
;
;
;
;
;
;
;
goto
m_s_4
m_s_5
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
428
m_s_0
movf
min_u,w
; W=min_u
call
conv_chr
;
;
;
;
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
;
;
;
;
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
;
;
;
;
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
;
;
;
;
;
;
;
;
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
Flags,PT_AON
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
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
call
dec_point1
goto m_p0
; -------------------------------------------------------------------; Indica que el parmetro "ALon" ha sido seleccionado
m_s_5
bsf
call
dec_point1
goto
m_p0
430
; -------------------------------------------------------------------mp_3x
clrwdt
call
refresca
call
Lee_PB
;
;
;
;
;
Push_button,w ; W=Push_button
goto
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.
;
;
;
;
Push_button,w ; W=Push_button
; W=W . Modo
; MODO (PB1)
goto
mp_2x
431
Push_button,w ; W=Push_button
; W=W . Enter
; ENTER (PB2)
goto
mp_3x
Push_button,w ; W=Push_button
; W=W . Siguiente
; SIGUIENTE (PB4)
goto
prog_sig
min_u,f
min_u,w
sublw .10
; min_u=min_u+1
; W=min_u
;
;
;
;
432
btfss STATUS,Z
goto
p_s1
clrf
incf
movf
min_u
min_d,f
min_d,w
; min_u=0
; min_d=min_d+1
; W=min_d
sublw .6
;
;
;
;
goto
p_s1
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
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
hrs_d,w
; W=hrs_d
call
conv_chr
movwf Dig_4
; Dig_4=W
movf
hrs_u,w
; W=hrs_u
call
conv_chr
movwf Dig_3
; Dig_3=W
movf
min_d,w
; W=min_d
call
conv_chr
movwf Dig_2
; Dig_2=W
movf
min_u,w
; W=min_u
call
conv_chr
movwf Dig_1
; Dig_1=W
call
call
dec_point3
Delay_25s
goto
mp_3x
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
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
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
;
;
;
;
;
;
;
;
;
goto
p_p1
hrs_d,w
sublw .2
; W=hrs_d
;
;
;
;
;
goto
p_p1
clrf
clrf
hrs_d
hrs_u
; hrs_d=0
; hrs_u=0
goto
p_s1
435
p_p1
movf
hrs_u,w
sublw .10
; W=hrs_u
;
;
;
;
goto
p_s1
clrf
hrs_u
; hrs_u=0
incf
movf
hrs_d,f
hrs_d,w
; min_d=hrs_d+1
; W=hrs_d
sublw .3
;
;
;
;
goto
p_s1
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
; ******************************************************
;
;
;
;
ref_pb
clrwdt
call
refresca
call
Lee_PB
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
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
437
; 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
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
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
; 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
goto
c_c0
ftemp,w
; W=ftemp
sublw .1
; W=W-1
btfsc STATUS,Z
goto
c_c1
ftemp,w
; W=ftemp
sublw .2
; W=W-2
btfsc STATUS,Z
goto
c_c2
442
movf
ftemp,w
; W=ftemp
sublw .3
; W=W-3
btfsc STATUS,Z
goto
c_c3
; W=ftemp
; W=W-4
btfsc STATUS,Z
goto
c_c4
; W=ftemp
; W=W-5
btfsc STATUS,Z
goto
c_c5
; W=ftemp
; W=W-6
btfsc STATUS,Z
goto
c_c6
; W=ftemp
; W=W-7
btfsc STATUS,Z
443
goto
c_c7
; W=ftemp
; W=W-8
btfsc STATUS,Z
goto
c_c8
; 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
; 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.
;
;
;
;
;
;
;
;
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
; W=Dig_1
; Digito=W
envia_byte
445
Dig_3,w
sh_1
; W=Dig_3
; continua en sh_1
; W=Dig_2
; Digito=W
call
envia_byte
movf
Dig_4,w
; W=Dig_4
sh_1
movwf Digito
; Digito=W
envia_byte
pulso_stb
sh_2
; 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
PORTA,RA3
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
PORTA,RA3
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
nop
nop
bcf
PORTA,RA0
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
447
bsf
PORTA,RA2
nop
nop
bcf
PORTA,RA2
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
;
;
;
;
;
; 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)
448
s_b7
s_b7)
; de lo contrario (bit7=1)
PORTA,RA1
; DATA=1
goto
s_c7
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
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)
PORTA,RA1
; DATA=1
goto
s_c6
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
s_c6
; Procesa el siguiente bit
; Bit 5:
449
s_b5
s_b5)
; de lo contrario (bit5=1)
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
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)
PORTA,RA1
; DATA=1
goto
s_c4
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
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)
PORTA,RA1
; DATA=1
goto
s_c3
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
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)
PORTA,RA1
; DATA=1
goto
s_c2
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
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)
PORTA,RA1
; DATA=1
451
goto
s_c1
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
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)
PORTA,RA1
; DATA=1
goto
s_c0
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
s_c0
return
; Regreso de subrutina
; -------------------------------------------------------------------; ******************************************************
; Rutina de refresco de la unidad de despliegue
; ******************************************************
;
;
;
;
;
;
;
;
;
452
return
; Regreso de subrutina
dis_int
;
;
;
;
call
shift16
bcf
Flags,RFSH
call
enb_int
return
; Regreso de subrutina
; -------------------------------------------------------------------; ***********************************************************
; Rutina de generacin de un tono para hacer sonar una bocina
; ***********************************************************
;
;
;
;
;
; W=250
; c_tono=W
; RB6=1 (activa la seal de salida "DIG_O")
; localizada en J2-2
call
refresca
call
Delay_01s
bcf
PORTB,RB6
de)
453
call
refresca
call
Delay_01s
de)
decfsz c_tono,f
goto
g_t0
return
; regreso de subrutina
; -------------------------------------------------------------------; ******************************************************
; Rutina de retardo de aproximadamente .01 segundos
; ******************************************************
;
;
;
;
Delay_01s
movlw .25
movwf c_tono_h
; W=25
; c_tono_h=W
clrwdt
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
; ******************************************************
;
;
;
;
;
Delay_25s
movlw .50
movwf CountQs
; W=50
; CountQsW
goto dl_0
; --------------------------------------------------------------------
454
; ******************************************************
; Rutina de retardo de aproximadamente 1 segundo
; ******************************************************
;
;
;
;
;
Delay_100s
;
;
;
;
; W=200
; CountQsW
movlw .250
movwf CountMs
; W=250
; CountMs=W
call
dl_0
dl_1
refresca
clrwdt
decf
; CountMs=CountMs-1
CountMs,f
btfss STATUS,Z
goto
dl_1
; continua contando
decf
CountQs,f
; CountQs=CountQs-1
btfss STATUS,Z
goto
; continua contando
dl_0
return
; Regreso de subrutina
; -------------------------------------------------------------------; ******************************************************
; Rutina que desactiva el relevador de salida
; ******************************************************
relay_off
;
;
;
;
455
bcf
PORTB,RB7
return
; Regreso de subrutina
; -------------------------------------------------------------------; ******************************************************
; Rutina que activa el relevador de salida
; ******************************************************
relay_on
;
;
;
;
PORTB,RB7
return
; Regreso de subrutina
; -------------------------------------------------------------------; ******************************************************
; Rutina que enciende la lmpara verde
; ******************************************************
lamp_green
bsf
bcf
PORTB,RB0
PORTB,RB1
return
; Regreso de subrutina
; -------------------------------------------------------------------; ******************************************************
; Rutina que enciende la lmpara roja
; ******************************************************
lamp_red
bcf
bsf
PORTB,RB0
PORTB,RB1
return
; Regreso de subrutina
; -------------------------------------------------------------------; ******************************************************
; Rutina que enciende la lmpara amarilla
; ******************************************************
lamp_yellow
bsf
bsf
PORTB,RB0
PORTB,RB1
456
return
; Regreso de subrutina
; -------------------------------------------------------------------; ******************************************************
; Rutina que apaga la lmpara
; ******************************************************
lamp_off
bcf
bcf
PORTB,RB0
PORTB,RB1
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".
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
int
;
;
;
;
;
457
; registro STATUS
swapf STATUS,W
movwf temp_stat
incf
Int_count,f ; Int_count=Int_count+1
bcf
INTCON,T0IF ;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
458
;
;
;
;
movlw .239
; W=239
movwf TMR0
; TMR0=W
call
int_tiempo
; STATUS=W
; Realmacena registro STATUS
swapf temp_w,f
; 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
459
;
;
;
;
CntMs_int,f ; CntMs_int=CntMs_int-1
btfss STATUS,Z
return
; Regreso de subrutina
;
;
;
;
;
;
;
movwf CntMs_int
; CntMs_int=W
bsf
;
;
;
;
Flags,RFSH
return
; 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
return
Int_count
; Int_count=0
i_t0
nop
nop
nop
461
nop
decfsz temp,f
goto
i_t0
Count_10ms,f ; Count_10ms=Count_10ms+1
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
return
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
return
c_seg_u
; c_seg_u=0
incf
c_seg_d,f
; c_seg_d=c_seg_d+1
return
; regreso de subrutina
; -------------------------------------------------------------------; ******************************************************
462
;
;
;
;
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
Push_button ; Push_button=0
; Ningn botn se encuentra oprimido.
463
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
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
469