Electrónica & Microcontroladores
Electrónica & Microcontroladores
Electrónica & Microcontroladores
3. LENGUAJE ENSAMBLADOR
2 USERS
3
4. EL ENTORNO DE DESARROLLO MPLAB IDE
Capítulo
desarrollo
MPLAB
IDE Introducción a MPLAB
92
Otras funciones
Simulación de nuestro
Resumen 127
Actividades 128
6 USERS
Introducción a MPLAB
Al abrir el programa por primera vez, aparecerá una ventana como la que se muestra
en la Figura 2. Esta ventana es la interfaz principal. Desde ahí trabajaremos para
comenzar, pero antes de hacerlo es conveniente llevar a cabo algunas configuraciones.
El entorno Ml)LAB contiene las herramientas para trabajar con cualquier
microcontrolador de la firma Microchip, así que debemos configurarlo según el PIC
que vayamos a utilizar. Para ello iremos al menú Configure/Select Device... , donde se
abrirá una pequeña ventana llamada Select Device, como vemos en la Figura 3.
7
4. EL ENTORNO DE DESARROLLO MPLAB IDE
Figura 3. En la ventana Select Device elegiremos el microcontrolador
que vamos a usar, en nuestro caso, el PIC16F84A.
USERS
En esta ventana, elegiremos en el cuadro marcado Device Family: la opción Mid-
Range 8-bit MCUs (12/16/MCP) y luego en el cuadro de selección marcado como
Device: el PIC16F84A. Por último, hacemos clic en el botón OK para cerrar la
ventana. Con esto ya tendremos configurado nuestro P1C. Si vamos a trabajar con otro
PIC diferente en posteriores ocasiones, debemos repetir este procedimiento para elegir
otro dispositivo.
Pero antes de comenzar a trabajar con el editor debemos guardar el archivo fuente
como un archivo con la extensión .asm. Para eso, vamos al menú File/Save As...,
8 USERS
Crear un nuevo archivo fuente
La ruta del archivo fuente no debe exceder los 62 caracteres, y debemos guardar el archivo en una
carpeta cercana a la raíz de la unidad donde trabajemos. Por ejemplo, podemos crear una carpeta
C:/ProyectosPIC o alguna similar, ya que si la ruta excede los 62 caracteres máximos. al momento
de intentar ensamblar el programa nos dará un error y no se llevará a cabo el procedimiento.
donde se abrirá el cuadro de diálogo para elegir en qué carpeta lo guardaremos.
Tendremos que escribir el nombre que le daremos a nuestro archivo fuente.
Debemos recordar poner el nombre y la extensión .asm, por ejemplo, Mi archivo
fuente.asm y guardarlo en la carpeta elegida.
10 USERS
Crear un nuevo archivo fuente
coma G) para que el ensamblador ignore todo lo que sea precedido del punto y coma
al momento de ensamblar. Esto es útil para describir los procesos llevados a cabo por
el programa. De esta forma, podremos hacer modificaciones o corrección de errores
más fácilmente en ocasiones posteriores.
Si queremos cambiar el color de los textos y también la fuente del editor, debemos ir al menú
Edit/Properties... mientras tenemos abierto algún archivo de código fuente, y en la ventana Editor
Properties ir a la pestaña Text. Ahí podremos cambiarlos a nuestro gusto, o regresar los colores a la
configuración predeterminada.
USER 11
4. EL ENTORNO DE DESARROLLO MPLAB IDE
en su lugar podríamos usar LeePuertoB, que nos indica que estamos en una
rutina para leer datos del puerto B, y de esa forma la etiqueta nos ayuda a tener
más claridad. Las etiquetas representan direcciones de la memoria de programa,
y el ensamblador colocará automáticamente las direcciones adecuadas al
momento del ensamblado en los lugares donde encuentre las etiquetas. De esta
forma, no tenemos que preocuparnos por hacerlo nosotros.
Los campos pueden separarse con espacios o tabulaciones, por ejemplo, en el siguiente
código están separados por tabulaciones:
inicio ;Mueve el Puerto B a W.
movf
PORTA, W ;Mueve el dato al Puerto A.
movwf
goto
PORTB inicio
;Reinicia el ciclo de lectura.
En este segundo ejemplo sólo los campos de etiquetas y de códigos están separados
por tabulaciones y los demás únicamente por un espacio. Es cuestión de gustos elegir
una forma u otra. También podemos dejar líneas en blanco para dar mayor forma a
nuestro código fuente, ya que el ensamblador también ignorará todas las líneas en
blanco al momento de ensamblar. El primer campo siempre es para las etiquetas, el
segundo para los mnemónicos, y el tercero para los operandos de las instrucciones. El
cuarto es para los comentarios, aunque realmente éstos pueden colocarse en cualquier
lugar, si los necesitamos.
12 USERS
Crear un nuevo archivo fuente
Como ya mencionamos, los comentarios deben ser precedidos por punto y coma, para
que el ensamblador los ignore. De esta manera, podemos colocar los comentarios en
cualquier lugar del código fuente donde los necesitemos. En el ejemplo de la Guía
visual: El formato del código fuente podemos ver que hay comentarios en el pruner
campo. Si utilizamos varias líneas para escribir comentarios, cada una de ellas debe
iniciar con punto y coma, como podemos observar en las primeras líneas del programa.
Es muy importante documentar los códigos fuente con comentarios suficientes que aclaren su
funcionamiento. Al estar creando un programa tenemos muy claro cómo funciona, pero después de
unas semanas o incluso días de no trabajar con él, puede ser indescifrable, aunque lo hayamos
escrito nosotros mismos. Es allí donde los comentarios cobran una gran importancia.
USER 13
4. EL ENTORNO DE DESARROLLO MPLAB IDE
DIRECTIVAS
Además de las instrucciones que ya estudiamos, también podemos usar directivas en
nuestro código fuente. Las directivas son palabras reservadas o comandos que
controlarán el proceso de ensamblado del código fuente. No debemos confundirlas con
las instrucclones, ya que no Menen equivalente en código máquina, sino que sólo
sirven para controlar el ensamblado al momento de realizarlo y, además, para facilitar
la escritura del código fuente. Es por eso que la gran mayoría de las directivas son
opcionales y por lo tanto podemos usarlas o no, es nuestra decisión. El ensamblador
Ml)ASIM tiene muchas directivas diferentes (alrededor de 60), pero en esta sección
estudiaremos sólo las principales, que son las más útiles. Estudiaremos otras en
secciones o capítulos posteriores.
Esta directiva sirve para asignar etiquetas a constantes u otros elementos. Lo que
pongamos en exp será asignado a la etiqueta. Por ejemplo, podemos usar esta directiva
para asignar nombres a registros de la memoria de datos:
contador EQU OXOC
incf contador, 1
En este ejemplo, el valor 0x0C es asignado a la etiqueta contador. De esta forma, cada
vez que escribamos contador en nuestro programa, el ensamblador lo sustituirá por el
valor 0x0C, que es la dirección del primer registro de la memoria de datos en
14 USERS
Directivas
siete
¿MAYÚSCULAS O MINÚSCULAS?
Para evitar escribir los valores directamente, podemos asignarlos a etiquetas y así
hacer más fácil la escritura de los programas al usar etiquetas en lugar de direcciones
o valores. Usualmente se asignan las etiquetas al principio, pero podemos hacerlo en
cualquier parte del programa.
[etiqueta 1]
[etiqueta 2]
ENDC
Normalmente, las directivas para el ensamblador se deben escribir en mayúsculas para que sean
reconocidas correctamente. Además, esto nos ayuda a diferenciarlas de otros elementos como los
mnemónicos. que deben ser escritos en minúscula. De todos modos, si escribimos las directivas en
minúscula el ensamblador también las reconocerá.
Muchas veces necesitaremos definir más de una etiqueta para la asignación de
nombres a los registros de la memoria de datos, y aunque podemos hacerlo mediante
varias directivas EQU, también tenemos la posibilidad de realizarlo mediante las
16 USERS
Directivas
USER 17
4. EL ENTORNO DE DESARROLLO MPLAB IDE
Esta directiva especifica la raíz para los valores de datos, que pueden ser en decimal
(dec), hexadecimal (hex), u octal (oct). Por ejemplo:
Incluso podemos hacer modificaciones en ellos aunque, por supuesto, no podremos ensamblarlos.
18
Directivas
USERS
r- [raíz]
Especifica la raíz para los valores de los datos, igual que con la directiva RADIX.
[microcontrolador]
Esta directiva define una cadena de texto para una etiqueta. En cualquier lugar donde
el ensamblador encuentre la etiqueta, lo sustituirá por exp. Podemos usarla para
asignar instrucciones completas a etiquetas, como por ejemplo:
Esta directiva borra la asignación que hayamos hecho antes con la directiva
#DEFINE. Por ejemplo, para el código anterior, si colocamos posteriormente:
#UNDEFINE carga_W
Borra la asignación del valor que tenía la etiqueta carga_W. De esta forma, podemos
volver a definir otro valor para ella si lo necesitamos.
Esta es una directiva muy importante, ya que permite incluir un archivo fuente
completo en el lugar donde la coloquemos. Es decir, al especificar un archivo, su
contenido será colocado en ese lugar, tal como si lo hubiéramos escrito ahí.
USERS
El archivo P16F84A.lNC
En este archivo, que se instala automáticamente junto con MPLAB, están las
definiciones de todas las etiquetas de los registros SFR del PIC16F84A. El archivo
P16F84A.INC se encuentra en la carpeta de instalación del ensamblador, que es
normalmente de Suite\P16F84A.INC.
Como hemos mencionado, podemos asignar etiquetas para los distintos registros de la
memoria de datos, ya sea de la sección Gl)R o SFR, para asignar nombres y hacer más
fácil su utilización en nuestros programas. Por ejemplo, para definir una etiqueta para
el registro STATUS, lo haremos de la siguiente forma:
USER 21
4. EL ENTORNO DE DESARROLLO MPLAB IDE
22
4. EL ENTORNO DE DESARROLLO MPLAB IDE
Cada vez que escribamos STATUS en nuestro código, se interpretará como 03h,
que es la dirección de este registro. De la misma manera podemos proceder en los
demás registros del SFR o los bits. Por ejemplo, para cambiar de banco de memoria
usaremos el bit 5 del registro STATUS que es llamado RPO, por lo que podemos
especificar:
Para indicar que deseamos poner a uno el bit RPO, es más fácil recordar los
nombres STATUS y RP() que sus direcciones, pero tendríamos que definir todas
estas etiquetas al inicio de nuestro programa, lo que nos puede demorar bastante. Es
por eso que el archivo llamado P16F84A.INC nos será de gran utilidad, sólo basta
agregarlo en nuestro código fuente mediante la directiva #INCLUDE
En este archivo están definidos los nombres de todos los registros del SFR, por lo
tanto debemos escribirlos como están en él. A continuación, transcribimos parte del
contenido del archivo P16F84A.INC:
23
4. EL ENTORNO DE DESARROLLO MPLAB IDE
EQU
EQU H ' 0001 '
EQU H ' 0002
EQU
EQU
USERS
24
Directivas
PORTB
EEDATA
EEADR
PCLATH
INTCON
OPTION REG
TRISA
TRISB
EECONI
EECON2
- STATUS Bits
IRP
RPI
RPO
NOT TO
NOT PD
z DC c
- INTCON Bits
GIE
EEIE
TOIE
INTE
RBIE
TOIF
INTF
RBIF
NOT RBPU
INTEDG
TOCS
TOSE
USERS
25
4. EL ENTORNO DE DESARROLLO MPLAB IDE
USERS
26
programa
Nuestro primer
Podemos observar cómo están definidos, por ejemplo, los bits de destino como F o W,
por lo que en las instrucciones donde necesitemos especificar un registro de destino, a
partir de ahora podemos hacerlo con F o W, en lugar de 1 ó 0. Por ejemplo:
#INCLUDE contador
EQU 0x0C
addwf contador, W
De esta manera, se indica que el destino es el registro W en lugar de tener que escribir
O. Por supuesto, antes de ejecutar esta instrucción debemos recordar incluir el archivo
P16F84A.INC mediante la directiva #INCLUDE. Es conveniente familiarizarnos con
los nombres asignados en él para poder usarlos. Para eso, podemos abrir el archivo en
MPLAB, para ver su contenido completo y estudiarlo.
USERS
27
4. EL ENTORNO DE DESARROLLO MPLAB IDE
De esta manera, en nuestro programa leeremos los datos en el Puerto A y los
pasaremos directamente al Puerto B, para visualizarlos en los leds.
Figura 9. Este circuito nos servirá para escribir nuestro primer programa
para el PIC16F84A y para estudiar, a su vez, el uso de los puertos.
28 USERS
programa
PIC16F84.
#INCLUDE
ORG 0x00
; programa principal:
inicio movf PORTA, W movwf PORTB
goto iniCi0 infinito.
END es
obligatoria.
Las primeras líneas son comentarios con el título, y una breve descripción del
programa. Como ya mencionamos, es importante documentar nuestros programas
para poder entenderlos en posteriores ocasiones, y saber qué función realizan. A
partir de
Al instalar MPLAB, junto con él se instala el archivo de definiciones P16F84A.INC para que podamos
usarlo. Además, se instalan muchos otros archivos de tipo include para muchos otros
microcontroladores PIC. ya que cada uno tiene sus propios nombres para los SFR, por lo que cada
PIC tendrá su propio archivo .INC.
Ensamblado de los
USERS
programa
Una vez escrito nuestro programa en el editor MPLAB, lo guardaremos como un
archivo .asm con un nombre que nos recuerde para qué sirve. Por ejemplo, llamaremos
a este código Mi primer programa.asm.
Una vez que tenemos nuestro archivo abierto en MPLAB, lo ensamblaremos. Si vamos
al menú Project/Quickbuild Mi primer programa.asm notaremos cómo, en forma
automática, IMPLAB colocará el nombre del archivo .asm que estamos intentando
ensamblar después de la palabra Quickbuild. Una vez elegido el comando, comenzará
el proceso de ensamblado.
USERS
31
4. EL ENTORNO DE DESARROLLO MPLAB IDE
Si nuestro código fuente tiene errores, el proceso de ensamblado se detendrá y se mostrarán los
errores encontrados en el reporte, y el número de línea en el que se encuentra cada uno. Si
USERS
programa
hacemos doble clic en alguna línea del reporte que nos indica un error, esto nos llevará a la línea del
código fuente donde se encuentra la falla, para poder corregirla.
Ensamblado de los
Figura 13. Errores que detienen el proceso de ensamblado y que habrá que corregir.
33
4. EL ENTORNO DE DESARROLLO MPLAB IDE
USERS
USERS
Simulación en MPLAB SIM
Durante el proceso de ensamblado pueden aparecer en el reporte las leyendas: Warning (atención)
o Message (mensaje), las cuales no son errores en sí, sino que nos indican algo que ocurrió para
35
4. EL ENTORNO DE DESARROLLO MPLAB IDE
poner atención. o algo que debemos vigilar o verificar. Si sólo aparecen estos mensajes. el programa
se ensamblará, pero si aparece algún error, el proceso de ensamblado se detendrá.
116
• El código fuente debe estar abierto en IMPLAB.
• Debemos ensamblarlo y asegurarnos de que fue ensamblado con éxito.
• Debemos elegir el microcontrolador adecuado (como ya vimos antes).
Después de asegurarnos de estos detalles debemos habilitar el simulador MPLAB
SIM. Para ello iremos al menú Debugger/Select Tool y en la lista que aparece
elegiremos la opción MPLAB SIM.
USERS
Simulación en MPLAB SIM
Aunque en este capítulo sólo estudiaremos la simulación con MPLAB SIM, podemos usar otros
simuladores para corregir o depurar nuestros programas. Algunos de ellos, como Proteus, permiten
ver una animación en tiempo real del circuito completo para ver su funcionamiento. La desventaja
es que este tipo de simuladores no son gratuitos y pueden ser muy costosos.
USERS
os controles de simulación
MPLAB ID v PL AB ditor
file <dit Yiew eroject Qebugger programmer LOOls Configure Window
Mi primer programa
asmx
43
O Run (ejecutar): este botón sirve para ejecutar el programa de forma continua. Si lo
presionamos, la simulación correrá libre y realmente no veremos nada hasta que se
detenga.
O Halt (alto): si presionamos este botón mientras la simulación está corriendo, se
detendrá. Este botón no estará activo hasta que corramos la simulación.
O Animate (animar): al presionar este botón, la simulación correrá paso a paso
por cada línea. Una flecha de color verde del lado izquierdo del código
fuente indicará la línea de programa que se está ejecutando.
O Step Into (paso a paso): con este botón podemos ejecutar manualmente el
programa un paso a la vez. Cada vez que lo presionemos se ejecutará una línea del
programa. Nuevamente, la flecha verde nos indicará la línea que estamos
ejecutando. Step Over (paso a paso sin subrutinas): este botón funciona de manera
similar al botón Step Into, pero con la diferencia de que al encontrar una
instrucción call (llamado a subrutina) no entrará en ella, sino que la ejecutará como
una sola instrucción.
O Step Out (salir de subrutina): si hemos entrado en la ejecución de una subrutina,
este botón permite salir de ella ejecutándola por completo en un solo paso.
O Reset (reset): este botón es equivalente a dar un reset al microcontrolador. Si lo
presionamos iniciaremos de nuevo el programa desde el principio, es decir, en la
primera línea.
O Breakpoints (puntos de ruptura): este botón abre una ventana para poder observar
una lista con los puntos de ruptura y, desde ella, crearlos, eliminarlos, activarlos o
desactivarlos. Veremos los detalles más adelante en este mismo capitulo.
37
4. EL ENTORNO DE DESARROLLO MPLAB IDE
VELOCIDAD DE SIMULACIÓN
Desde la ventana Simulator Settings podemos configurar la frecuencia eligiendo
las opciones de Hz, KHz o MHz y escribiendo el valor deseado. Esta frecuencia
de oscilación realmente no tiene efecto en la velocidad de la simulación, sólo es
para que los tiempos marcados sean correctos con respecto a nuestro circuito
de oscilador que utilicemos en nuestro P 1C.
Podemos cambiar la velocidad de la simulación del botón Animate. Para ello, vamos al menú
USERS
Simulación en MPLAB SIM
USERS
39
4. EL ENTORNO DE DESARROLLO MPLAB IDE
END
O MPLAB SIM: si esta leyenda está presente, indica que MPLAB SIM está activado. Si
no está, el simulador no está activado. Si el simulador no está activado, algunos de
los elementos siguientes puede que no aparezcan tampoco.
O Microcontrolador: indica el microcontrolador elegido con el que estamos
trabajando.
O Contador de programa (PC): muestra en todo momento el valor del contador de
programa (PC).
O Registro de trabajo (W): muestra el valor contenido por el registro de trabajo W.
O Banderas del registro STATUS: muestra los estados que tienen los bits o
banderas Z, DC y C del registro STATUS. Si están en minúsculas, indican un
cero, y en mayúsculas un uno. Por ejemplo y z=O.
O Frecuencia del oscilador: se indica la frecuencia del oscilador que hemos
configurado. Debe coincidir con la frecuencia que tenemos pensado
usar realmente.
O Banco de memoria: indica cuál es el banco de la memoria de datos que está
seleccionado.
De esta forma tendremos información de lo que está sucediendo con estos
elementos mientras corremos la simulación del programa. Los elementos cambiarán
automáticamente para indicarnos su estado.
Visualización de registros
Además de la barra de estado podemos tener más detalles sobre lo que está
sucediendo al correr la simulación. Por ejemplo, podemos observar mediante
otras ventanas los estados que toman los registros de la memoria de datos para
ver si el programa funciona como lo esperamos.
40 USERS
Simulación en MPLAB SIM
Figura 17. Aquí podemos vigilar el estado de estos registros durante la simulación.
0 00
0x00
O 0x00 O Ox00
41
4. EL ENTORNO DE DESARROLLO MPLAB IDE
o oxoc o 0x00
0 0x00
0
0 0x00 0 o
ogao
Figura 18. La ventana File Registers muestra los valores de todos los
registros de la memoria de datos, incluyendo los GPR y SFR.
USERS
La ventana Watch
Si vamos al menú View y activamos la opción Watch aparecerá una ventana con ese
título que al principio se encontrará vacía.
Add SFR
La ventana Watch nos será útil para observar únicamente los registros o bits
individuales que necesitemos. Es decir, podemos personalizar en ella los
registros o bits de la memoria de datos que queremos vigilar. Esto lo hacemos
al elegir de las listas desplegables el elemento deseado, y luego con un clic en el
botón Add SER o Add Symbol, respectivamente. La ventana Watch tiene cuatro
pestañas abajo, por lo que podemos tener diferente configuración en cada una
de ellas. En estas ventanas podemos ver los valores que toman los registros
durante la simulación y así poder analizar si el programa realmente hace lo que
necesitamos o no. Cuando hay un cambio en alguno de los registros, sus valores
contenidos se pondrán en color rojo para indicarlo.
42
Simulación en MPLAB SIM
USERS
43
4. EL ENTORNO DE DESARROLLO MPLAB IDE
Puerta A a W.
b.
Podemos insertar todos los puntos de ruptura que necesitemos. Cuando corremos
la simulación mediante el botón Run o Animate ésta se detendrá
automáticamente en el primer breackpoint que encuentre. Para reanudar la
simulación a partir de ahí, sólo basta con presionar nuevamente el botón Run o
Animate. Es
44
Simulación en MPLAB SIM
que necesitemos. Pero esto no es válido para simular entradas de datos en los registros de los
puertos configurados como entradas, para ello debemos usar estímulos.
USER 45
4. EL ENTORNO DE DESARROLLO MPLAB IDE
USERS
Estímulos
Podemos cambiar los valores de los registros con un doble clic en ellos y escribiendo
el valor que necesitemos. Pero cuando tengamos un puerto de entrada de datos, esto
no será válido. Para simular los datos en los pines de entrada de los puertos debemos
hacerlo mediante estímulos (stimulus). A través de los estímulos podemos simular
entradas de datos o señales en los puertos que tengamos configurados como
entradas. Para configurar los estímulos necesarios vamos al menú Debugger/
Stimulus/New Workbook y se abrirá la ventana con el título Stimulus — [Untitled].
Podemos definir todas las entradas necesanas en las siguientes filas, de acuerdo con
lo que necesitemos.
Figura 25. Las cinco líneas del Puerto A configuradas en modo Toggle.
USER 47
4. EL ENTORNO DE DESARROLLO MPLAB IDE
USERS
RESUMEN
Es conveniente acomodar las ventanas de tal forma que las veamos todas a la vez. Una
vez que está todo listo podemos presionar el botón Animate, para que la simulación
corra. Veremos la flecha de color verde recorriendo las líneas del programa. Con los
botones Fire de la ventana Stimulus podemos cambiar el estado del puerto de entrada
para ver cómo afectan a los valores de la ventana Watch. Como es de esperarse, si todo
está bien, al modificar los estados de las líneas del Puerto A, el cambio se reflejará en
el registro PORTA, y luego serán enviados al puerto de salida que es el Puerto B, ya
que ese es el objetivo del programa, confirmando así que el funcionamiento es
correcto. También podemos correr la simulación con el botón Step Into para hacerlo
paso a paso.
48
Simulación en MPLAB SIM
En este capítulo hemos aprendido las bases para usar el software MPLAB IDE, que es la
herramienta para escribir nuestros programas, ensamblarlos y simularlos. Dado que la
escritura de programas es fundamental para el uso de microcontroladores, es necesario
dominar bien la programación y las herramientas para hacerlo. En capítulos posteriores
continuaremos estudiando el uso del software, las directivas y demás funciones para
entenderlas mejor.
USER 49
TEST DE AUTOEVALUACIÓN
I ¿Para qué sirve el entorno MPLAB?
2 ¿Cuántos campos se usan para la
estructura del código fuente?
50
5. GRABADORES DE PIC
52 USERS
5. GRABADORES DE PIC
GRABACIÓN DE
MICROCONTROLAD 1
ORES PIC 1
F
igura I.
Configuració
n de los pines
del
PIC16F84A
para la
grabación de
la memoria
de programa.
54 USERS
Algunos de los pines del
microcontrolador toman ahora una
función alternativa especial que permite
leer o escribir en la memoria de datos y
de programa. El pin Master Clear (4)
ahora será la entrada del voltaje de
programación o Vpp. Cuando llevamos
este pin a un flanco de subida desde 0
hasta un voltaje de entre 12 y 14 V, el
microcontrolador entra en el modo
llamado Program/Veri6', en el cual ya
se puede tener acceso para la lectura o
escritura de datos. Los pines Vdd (14) y
Vss (5) son para el voltaje de
alimentación de 5 V. El pin RB7 (13) es
la entrada y salida de datos en serie. Y
el pin RB6 (12) sirve para introducir la
señal de reloj que sincronizará los
procesos.
Grabadores
GRABADORES
Para enviar o grabar el programa en la memoria del microcontrolador se utiliza un
dispositivo llamado grabador. Este grabador es un circuito en el cual colocaremos el
microcontrolador para que pueda recibir los datos del archivo .hex que grabaremos en
su memoria, con la ayuda de una computadora que será quien los envíe hacia éste
siguiendo el protocolo de comunicación ICSP. La conexión se realiza mediante alguno
de los puertos de comunicación de la computadora, como pueden ser, el puerto serial,
el puerto paralelo, o por un puerto USB.
Software
grabador
Grabador
PIC
Código máquina
USER 56
de
Ahora que conocemos en qué consiste el grabador, veamos cuáles son los
elementos básicos que necesitaremos para enviar el programa hacia nuestro P
1C:
USER 57
5. GRABADORES DE PIC
Con estos grabadores podemos trabajar la gran mayoría de los
microcontroladores P1C. La ventaja de adquirir un grabador como estos es la
alta confiabilidad y compatibilidad en el funcionamiento, ya que está diseñado
por el propio fabricante de los microcontroladores y eso asegura un correcto
funcionamiento en todo momento. También existen otros grabadores
profesionales, como MPLAB PM3, que puede grabar prácticamente todos los
microcontroladores P 1C. Este tipo de grabadores se conecta a la PC por medio
de un puerto USB y también tiene la posibilidad de funcionar por sí solo, es
decir, sin necesidad de la computadora, aunque el precio de estos dispositivos es
muy elevado.
Grabadores bajo costo
Grabadores JDM
Afortunadamente, existe mucha información en Internet acerca de grabadores de
microcontroladores PIC económicos y fáciles de construir. Por ejemplo, los grabadores
JDM y sus múltiples variantes son muy
populares hoy en día. En la página web de su
creador podemos encontrar la información
58 USERS
de
sobre sus características: www.jdm. homepage.dk/newpics.htm. También podemos
adquirir en alguna tienda de electrónica un grabador basado en los JDM, que son muy
sencillos y económicos. Uno de los más populares es el conocido como T20-SE, el
cual se conecta a la PC por medio del puerto serial.
Figura 5. El grabador T20-SE basado en
JDM es un grabador de bajo costo y lo También podemos encontrar otros
podemos adquirir armado y listo para grabadores económicos que no están
funcionar. basa-
dos en los J DM que mencionamos antes, pero que se conectan por medio del
puerto USB, lo cual los hace muy sencillos de implementar. Además, la ventaja
de comprar un grabador de bajo costo es que ya está listo para usar. No obstante,
en caso de adquirir uno de estos grabadores, deberemos también leer la
documentación que lo acompaña para aprender a utilizarlo.
USER 59
5. GRABADORES DE PIC
• Puede grabar una gran variedad de microcontroladores PIC.
• Los componentes son fáciles de encontrar y económicos.
Además, nuestro grabador está basado en los JI)M, por lo que es compatible con
cualquier otro que construyamos o compremos también basado en JDM.
Existen diversos nombres para los dispositivos que se usan para escribir en la memoria de programa
de los PIC. Algunos los llaman programadores, pero el término se puede confundir con el acto de
escribir un programa o programar. Otros los llaman quemadores de PIC. aunque en realidad no hay
nada que se "queme". El término más aceptado es simplemente grabador.
60 USERS
Construcción de un grabador PICs
de
R l: Resistor 4.7k
R2-R3: Resistores 470
R4: Resistor 2.2k
R5: Resistor IOk
Cl: Capacitor electrolítico 100uf / 16V
C2: Capacitor electrolítico 22uf / 16V
(21-(22: Transistores NPN 2N3904
Dl-D4: Diodos IN4148
1)5: IN5237B Diodo zener 8.2V
DG: IN 5231 B Diodo zener 5.IV
LDI: LED 3mm rojo
LD2: LED 3mm amarillo
LD3: LED 3mm verde
DB9: Conector DB9 hembra
ZIF18: Zócalo ZIF de 18 pines
Como podemos observar, estos componentes son bastante comunes, por lo que no
tendremos mayor problema para encontrarlos en las tiendas locales de electrónica.
En caso de no hallar los diodos zener indicados, podemos reemplazarlos por cualquier
otro diodo zener de 8.2 V y 5.1 V de medio Watt, respectivamente. Todos los
USER 61
5. GRABADORES DE PIC
resistores son a 1/4 de Watt y 5% de tolerancia. Para quienes quieran construir un
circuito impreso para el grabador, en el sitio web de la editorial (www.redusers.com)
podemos descargar el archivo llamado Grabador.pdf, con el dibujo del circuito listo
para imprimir.
También necesitaremos un zócalo o base para circuito integrado tipo ZIF de 18 pines.
Si no logramos conseguir una base de tipo ZIF, podemos colocar en su lugar una base
para circuito integrado común de 18 pines que es muy fácil de conseguir en cualquier
tienda de electrónica. Aunque una base del tipo ZIF es sumamente útil para poder
colocar y retirar los microcontroladores del grabador con mucha comodidad.
Figura 8. Un conector DB9 hembra servirá
para unir el grabador a un puerto serial
(COM) de la PC.
Como podemos observar, el circuito del
grabador contiene tres leds. El led rojo
indica el voltaje de programación Vpp,
es decir, cuando el PIC esté siendo
grabado, este led deberá encender. El led
amarillo es la señal de reloj (Clock). Y,
62 USERS
Construcción de un grabador PICs
por último, el led verde indica el voltaje En la Figura 11 podemos observar la
de alimentación de 5 V. ubicación y la forma de conexión de los
componentes sobre la placa de circuito
de
Figura 9. Una base de cero fuerza Figura IO. Una base para circuito
de inserción (ZIF) nos será de utilidad para integrado
colocar el PIC en el grabador. común puede sustituir la base tipo ZIF si
no la encontramos en las tiendas.
Si no tenemos la posibilidad de construir el circuito impreso, no debemos
preocuparnos ya que podemos armar el grabador en una placa universal o incluso en
un protoboard, asegurándonos de que las conexiones sean correctas.
USER 63
5. GRABADORES DE PIC
Este grabador puede trabajar con microcontroladores PIC de las siguientes familias:
PIC12Fxxx, que son de 8 pines, y PIC16F62x y PICI 6Fxx, que son de 18 pines, entre
los que, por supuesto, está el PIC16F84A. Es importante colocar de forma adecuada el
PIC en el zócalo del grabador, ya que si lo colocamos invertido podemos arruinarlo y
dejarlo inservible. La forma de colocar los microcontroladores, tanto los de 18 pines
como los de 8 pines, es con el pin I orientado hacia la palanca de liberación del zócalo
ZIF. Como referencia, en la Figura 11 indicamos cuál es el pin 1 del zócalo. Si
utilizamos una base para circuito integrado común, entonces habrá que colocarla de tal
forma que coincida también con la orientación adecuada.
64 USERS
Construcción de un grabador PICs
USER 65
Construcción de un grabador PICs
de
66
Construcción de un grabador PICs
Interface
USERS
Al presionar OK en la ventana Hardware settings, y si estamos usando Windows 2000
o XI), aparecerá una pequeña ventana con el texto Privileged instruction, que nos
advierte que necesitamos instalar el driver o controlador para estos sistemas
operativos. Más adelante veremos cómo hacerlo.
rog .O - rogramador prototipos
privileged instruction ,
Acotar
Al presionar Aceptar es posible que veamos otras ventanas de error, ya que todavía no
hemos instalado el driver necesario para nuestro sistema operativo. Sólo debemos
presionar Aceptar en ellas hasta que se abra el programa (Figura 16).
rograma r proto pos
Archivo Edkion Wer Ajustes çommdo HerrarNentas yer
USER 67
5. GRABADORES DE PIC
Dirección - Datos Eeprom
0000 :
0008:
0010 :
0020: 0018:
0028: Checksum Valor O
ŸÿyÿŸYÿÿ 0030:
0038: palatya conto: 3FF1 h
Buffet Buffet 2 Buffer 3 4 Buffer S
De aquí en adelante, cada vez que abramos el programa aparecerá la ventana con la
leyenda Privileged instruction, de modo que para evitarla debemos instalar el con-
USERS
de
DE INGLÉS A ESPAÑOL
trolador, que es el archivo icprog.sys, y que debe estar en la misma carpeta que el
archivo icprog.exe. Después de asegurarnos de llevar a cabo este procedimiento,
vamos al menú Ajustes/Opciones y en la ventana titulada Opciones hacemos clic en la
pestaña Miscelánea. En ella activaremos la opción Habilitar Driver NT/2000/XP
(Figura 17) y al hacerlo aparecerá un mensaje que nos preguntará si deseamos reiniciar
IC-Prog para que el driver quede instalado, a lo cual diremos que sí.
pciones
Avisos I FC I programEón
Arrastrar 8 Sotar I Smartcard I Idioma I Shell
I Habilitar Driver
Prioridad del Controlar Vcc pæa JOM
proceso Pcner
Normal todas
las
Ala sahdas
a nivel
Tiempo real (Con
IC-Prog debe instalarse en el mismo idioma del sistema operativo, pero si por alguna razón esto no
es posible, podemos cambiarlo de idioma en forma manual. Para ello vamos al menú Settings/
Options y en la pestaña Language seleccionamos un idioma de la lista. En este caso elegimos la
opción Spanish, y al hacer clic en el botón Ok ya tendremos IC-Prog en español.
USER 69
5. GRABADORES DE PIC
3FFIh
es que controlan
, etcétera.
programa, desde
s el dispositivo con
el PIC16F84A.
es de la palabra de
mportante, como el
os datos que se
datos del PIC. Los
USERS
de
O Código de programa: en esta zona se muestran los datos del código de programa
o código máquina que vamos a grabar o que hemos leído en nuestro
microcontrolador. Se muestran en hexadecimal.
Podemos ver que la interfaz del programa es sencilla y no hay mayor problema para
entenderla. Veamos ahora para qué sirven los botones de la barra de herramientas.
La barra de herramientas de IC-Prog
USER 71
5. GRABADORES DE PIC
ireoció - Cód o ro r ma
O Abrir: este botón nos permite abrir el archivo .hex que vamos a grabar. Al
presionarlo aparecerá la ventana que nos permitirá explorar en las carpetas de
nuestro disco duro hasta encontrar el archivo deseado y abrirlo. Al hacerlo, los
datos del archivo aparecerán en la zona de código de programa.
Guardar como: este botón nos permite guardar un archivo de código fuente .hex.
Esto es útil si modificamos algún dato de la zona de código de programa y
queremos guardar esos cambios, o guardar el archivo leído de un
microcontrolador.
O Configurar el hardware: este botón nos da acceso a la configuración del
programador, para elegir qué programador usaremos y el puerto en donde está
conectado, como ya vimos antes.
O Opciones: con este botón abriremos la ventana Opciones para hacer ajustes en la
configuración de diferentes parámetros del programa.
O Leer todo: con este botón podemos leer los datos del PIC que coloquemos en
nuestro grabador, es decir, leeremos el programa almacenado en él, así como los
datos de la memoria EEPROM y los bits de configuración. Si el PIC está protegido
no podremos leerlo.
O Programar todo: este botón envía el archivo que tengamos abierto en el buffer
activo al microcontrolador, para ser grabado en él.
S
72 USERS
Construcción de un grabador PICs
O Verificar todo: con este botón se realizará una verificación de los datos grabados
en el PIC, es decir, se leerán los datos del PIC y se compararán con los del buffer
activo para ver si son iguales.
O Vista en ensamblador: mediante la activación de este botón veremos en la ventana de
código de programa el código fuente, es decir, se hará una traducción del código
máquina a código fuente del archivo en el buffer activo.
O Vista en hexadecimal: mediante la activación de este botón veremos en la ventana de
código de programa el código máquina codificado en hexadecimal.
Bit 13 a 4 (CP, bits de protección de código): estos bits sirven para configurar la
protección del código o el programa grabado en el microcontrolador. Si se ponen a 1,
el código no estará protegido, pero si se ponen a 0, el código estará protegido y no
podrá ser leído. Esto sirve para proteger el programa grabado en nuestro P 1C, para
que otras personas no puedan tener acceso a él.
Bit 3 (PWRTE', bit de habilitación del Power-up timer): este bit sirve para activar el
USER 73
de
Los bits configuración
OO = Modo LP
01 = Modo XT
IO = Modo HS
11 = Modo RC
La directiva CONFIG
Esta directiva nos ayudará precisamente a establecer los bits de la palabra de
configuración desde nuestro código fuente. Si bien ya vimos un ejemplo de esta
directiva en el Capítulo 4, cuando estudiamos nuestro primer programa, ahora veremos
cómo funciona esta directiva en detalle.
LO primero que hay que notar es que esta directiva inicia con dos guiones bajos. Es
importante recordarlo para escribirla correctamente. Para poder usarla debemos incluir
el archivo P16F84A.INC mediante la directiva #INCLUDE, ya que los parámetros
para el uso de _CONFIG están definidos en este archivo. Si no lo incluimos, al
ensamblar nos dará error. Un ejemplo del uso de la directiva _CONFIG es el siguiente:
Normalmente, luego de grabar un PIC, se hace una verificación de los datos grabados, es decir, se
leen los datos que se acaban de grabar en el microcontrolador y se comparan con los del archivo
USER 74
de
.hex que se utilizó. Si todos los datos son iguales. significa que se han grabado correctamente. De
todas formas, podemos deshabilitar la verificación en las opciones del programa.
Observamos que los parámetros se separan mediante el símbolo & para definir cada
configuración de forma independiente. Se pueden colocar los elementos en cualquier
orden, sólo siguiendo la correcta sintaxis, que es:
LP_OSC = Oscilador LP
XT_OSC = Oscilador XT
_HS_OSC = Oscilador HS
RC_OSC = Oscilador RC
75
5. GRABADORES DE PIC
desactivado, PWRTE deshabilitado, WDT habilitado. oscilador en modo RC. Debemos poner mucha
atención en esto o nuestros proyectos no funcionarán adecuadamente.
onfiguración
3FFF 3FFF
Oscaedor,
3EEF 3FEE
3FFF 3FFF
3EEF 3FFE
3EFF 3FFE
3FFF 3FFF
3E'EE
3EEF
3FFE
3EFF 3FFE
3EEF 3FFE
3EFF 3FFE Etts contigureciÓn:
3FFF 3FFF
3FFF PART
Checksum
Valor ID
alabra contig:
3FF1h
O Oscilador: esta lista nos permite elegir el tipo de oscilador que utilizaremos.
O WDT: esta opción nos permite habilitar el WDT. Si tiene marca es que está habilitado
y si no la tiene es porque está deshabilitado.
O PWRTE: en esta opción podemos habilitar o deshabilitar el Power-up timer.
O CP: esta opción habilita o deshabilita la protección de código (Code Protection).
O Palabra config: aquí se muestra el valor en hexadecimal que será escrito en la
palabra de configuración del microcontrolador, según las opciones elegidas.
Si definimos la configuración en el código fuente mediante la directiva _CONFIG,
entonces al momento de abrir el archivo .hex en IC-Prog podemos observar cómo,
En la página web de Microchip podemos encontrar la documentación del grabador PICkit 2, la cual
incluye el diagrama del circuito. Para los más atrevidos, es posible construirlo a partir de él. En
76 USERS
de
Internet podemos encontrar algunos grabadores conocidos como clones de este grabador. que
pueden ser una buena alternativa si queremos armar un grabador que se conecte por USB.
USERS
en el área de configuración, los valores activados en ella se corresponden con los que
definimos en el código fuente. De esta forma ya no tenemos que configurar en IC-
Prog, y nuestro código máquina estará completo para grabarse en el microcontrolador.
Si lo necesitamos, también podemos modificar las opciones de la palabra de
configuración en IC-Prog antes de grabar el microcontrolador.
Una vez que tenga listo el archivo .hex resultante del ensamblado desde MPLAB
de Mi primer programa.asm, abra IC-Prog.
77
5. GRABADORES DE PIC
78 USERS
Grabar nuestro primer programa
Una vez abierto el archivo a grabar notará cómo aparecen los datos en hexadecimal en
la zona de Código de programa. Y si ha usado la directiva CONFIG, los bits de
configuración estarán tal como los configuró en ella.
Para grabar el programa, haga clic en el botón Programar todo (el que tiene la imagen
de un pequeño circuito integrado y un relámpago amarillo). Aparecerá una ventana de
confirmación que le preguntará si desea grabar el dispositivo.
79
5. GRABADORES DE PIC
USERS
Una vez que presionó Yes (sí), aparecerá una pequeña ventana que le indicará el
proceso de grabación del código del programa.
Después aparecerá otra ventana que indicará que se están grabando los datos en la
memoria EEPROM, si es que los hay. Luego verá otra ventana que informará que se
está grabando la palabra de configuración.
Una vez grabado el programa en el PIC, aparecerá una ventana que señalará que la
verificación se está llevando a cabo. Esta sólo la veremos si tenemos activada la
opción de verificar después de grabar en la configuración del programa.
Por último, aparecerá una ventana que indicará si la verificación se ha llevado a cabo
con éxito. Si es así, entonces la grabación del microcontrolador está completa.
Leer un microcontrolador
Como ya vimos antes, existe un botón en la barra de herramientas de IC-Prog
llamado Leer todo, el cual nos servirá para leer el programa o código máquina
grabado en nuestro microcontrolador. Esto puede ser útil para recuperar un
USERS
programa del PIC si no contamos con el archivo fuente o con el propio código
máquina. Para leer el programa sólo bastará con tener el PIC que vayamos a leer
Grabar nuestro primer programa
colocado en el grabador y presionar el botón Leer todo, para que se realice la lectura.
Al finalizar aparecerá el código leído en el Buffer activo.
Figura 18. Podemos leer el programa y los datos que contiene un PIC
en su memoria, aunque sólo si no está protegido.
Una vez que hemos leído el código máquina desde el P1C, podemos guardarlo desde
IC-Prog como un archivo .hex. Para ello, iremos al menú Archivo/Guardar como
aparecerá la ventana Guardar como, en donde exploraremos en nuestro disco hasta
encontrar la carpeta deseada, pondremos un nombre al archivo en la sección
Nombre: y lo guardaremos. También podemos grabar este código leído en otro
microcontrolador, si lo deseamos. Sólo bastará con cambiar el microcontrolador en el
grabador y llevar a cabo el proceso de grabación como ya conocemos.
Borrar un microcontrolador
Por supuesto, si queremos eliminar un programa (sin grabar otro) de nuestro
microcontrolador, también podemos hacerlo. Esto se lleva a cabo mediante el botón
Borrar todo de la barra de herramientas de IC-Prog. Al presionarlo, si hemos activado
la opción de confirmación, aparecerá una ventana que nos pedirá que confirmemos si
queremos borrar el dispositivo. En caso de elegir la opción Yes, entonces IC-Prog
procederá con el borrado de la memoria del microcontrolador. Aparecerá una
ventana que nos informará que el proceso de borrado se ha llevado a cabo con éxito.
Si intentamos leer el dispositivo, entonces el buffer quedará con todas las casillas con
el valor 3FFF, dado que el proceso de borrado pone todos los bits de la memoria con
unos.
81
5. GRABADORES DE PIC
En este capítulo hemos conocido la forma de escribir o grabar nuestros programas en la
memoria de programa del microcontrolador. Propusimos la construcción de un sencillo y
económico grabador de PIC basado en los grabadores JDM, y estudiamos en detalle su
utilización junto con el programa IC-Prog. Conocimos, además, algunas alternativas como
los grabadores profesionales. Con lo visto, ya estamos listos para comenzar a construir
poderosos proyectos con microcontroladores PIC.
USERS
USERS
TEST DE AUTOEVALUACIÓN código máquina, grabe ahora este
nuevo programa en el PIC16F84A y
I ¿Para qué debemos grabar un PIC? compruebe que funcione
2 ¿Cómo se llama el protocolo de grabación correctamente en el circuito.
de microcontroladores PIC? USERS
3 ¿Qué es un grabador?
USERS
control. Para eso, primero debemos
PROYECTOS CON definir cuál es la función que
cumplirá y cómo lo hará. Podemos
MICROCONTROLADORE utilizar una herramienta de diseño,
S PIC como los diagramas de flujo, que nos
ayudará a diseñar el funcionamiento
Para el diseño de un proyecto de de nuestro programa. Más adelante
manera eficiente, debemos seguir un hablaremos en profundidad sobre los
orden. Por eso, en esta sección diagramas de flujo.
estudiaremos el proceso para poder
diseñar nuestros proyectos de forma 4. Escritura del programa: una vez
ordenada. Aunque los pasos expuestos definido el programa mediante el
no son todos obligatorios ni tampoco diagrama de flujo, es momento de
necesariamente debemos seguir este escribirlo. Para ello ya aprendimos
cómo hacerlo en el editor de
esquema, nos puede servir de guía al
MPLAB. En él escribiremos nuestro
momento de intentar diseñar un
código fuente. Para escribir nuestros
proyecto. programas debemos conocer algunas
técnicas de programación. En las
1. Definir el proyecto global: lo secciones posteriores de este capítulo
primero que debemos hacer es veremos algunas técnicas y trucos de
decidir el proyecto, es decir, definir programación.
claramente qué es lo que queremos o 5. Ensamblado y simulación del
necesitamos. Podemos preguntarnos: programa: una vez escrito el
¿qué es lo que necesito o deseo que
programa (el código fuente)
haga mi proyecto?
estamos listos para ensamblarlo y
2. Diseño del circuito: una vez que de esta forma generar el código
tenemos clara la función que debe máquina. Además de esto, en este
cumplir el proyecto, podemos punto también podemos hacer uso
diseñar un circuito, el cual por de algún simulador. Como ya
supuesto será gobernado por el
estudiamos, el uso de IMPLAB
microcontrolador. En esta fase
SIM puede sernos de mucha
debemos diseñar por completo el
circuito definiendo cuál es la tarea utilidad para evaluar si nuestros
del P 1C, ya que en base a esto programas funcionan
escribiremos el programa. Es por eso correctamente, aunque este paso es
que es muy importante determinar opcional. También podemos usar
perfectamente el circuito. otros simuladores si lo deseamos.
3. Definición del programa: una vez 6. Grabación del programa: después de
diseñado nuestro circuito electrónico, haber terminado la escritura del
estamos listos para comenzar a código fuente y el proceso de
pensar en el programa que llevará su ensamblado del programa, ya
6. TÉCNICAS DE PROGRAMACIÓN EN ENSAMBLADOR
USERS
Proyectos con microcontroladores PIC
necesario, como en el programa, donde puede haber algo que omitimos o que no
funciona completamente bien. En este caso habrá que regresar al editor IMPLAB y
hacer los cambios y correcciones pertinentes.
9. Documentación: una vez que nuestro proyecto está funcionando correctamente
según lo planeado, es bueno elaborar la documentación para tener claro cómo
funciona, cómo hay que operarlo y demás. Esto ayudará a facilitar el uso del
proyecto, sobre todo si lo va a emplear otra persona además de nosotros. La
documentación también nos facilitará futuras modificaciones.
Diagramas de flujo
OTROS USOS DE LOS DIAGRAMAS DE FLUJO
Un diagrama de flujo, como su nombre lo indica, es un gráfico que nos conduce paso a
paso a la resolución de un problema o un proceso y consiste en una serie de símbolos
especiales que nos van indicando gráficamente los procesos necesarios.
Figura
Los
símbolos básicos usados en un diagrama
de flujo definen los pasos de cómo se desarrollará el programa.
Aunque los diagramas de flujo se utilizan mucho en las tareas de programación, no son la única
aplicación que tienen. En general, un diagrama de flujo puede emplearse para representar cualquier
proceso o para resolver cualquier tipo de problema. por ejemplo. se puede dibujar un diagrama de
flujo para describir el proceso de fabricación de un producto.
USER 87
6. TÉCNICAS DE PROGRAMACIÓN EN ENSAMBLADOR
• Inicio o fin: este símbolo se usa para indicar el inicio o fin de un programa o un
proceso. El diagrama de flujo siempre debe comenzar y terminar con este símbolo
para definir perfectamente el inicio y el fin. De todos modos, algunos programas
pueden no tener un final definido, por ejemplo, en algunos casos el programa o
parte de él se repite constantemente, por lo que no hay un fin.
Inicio
Procesos
Proceso 1
Proceso 2
Proceso 3
USERS
Proyectos con microcontroladores PIC
• Subrutina: se utiliza para indicar un llamado a una subrutina que llevará a cabo
un proceso específico. La subrutina normalmente se detalla en un diagrama
independiente, si se considera necesario hacerlo.
Proceso 1
Subrutina
Proceso 3
• Decisión: se utiliza en los procesos en donde hay una decisión que tomar y en
base a ella se seguirá un camino u otro, dependiendo si la condición fue cumplida o
no.
USER 89
6. TÉCNICAS DE PROGRAMACIÓN EN ENSAMBLADOR
S
• Conector: en ocasiones, el diagrama de flujo puede ser muy grande
(dependiendo de la complejidad y la extensión del programa que se intenta
diseñar), por lo que no cabrá en una sola hoja. Los conectores sirven para poder
llevar un orden en el camino que sigue el diagrama en caso de que necesitemos
dividirlo. Generalmente, para conectar una sección con otra del diagrama, se
utilizan números.
Inicio
Proceso 3
Proceso 1
Proceso 2
USERS
Proyectos con microcontroladores PIC
Existen otros símbolos que podemos utilizar para diagramas de flujo, como la inclusión de
documentos, salida o entrada de datos, etcétera. Sin embargo, no son tan empleados usualmente,
o son utilizados en diagramas de flujo destinados para otros fines diferentes de los de la
programación.
USER 91
6. TÉCNICAS DE PROGRAMACIÓN EN ENSAMBLADOR
Como veremos, existen muchas ventajas en usar una subrutina. Por ejemplo: reduce la duplicación
innecesaria de código, permite el uso del código en diferentes programas, mejora la comprensión
del programa y lo hace más manejable, divide la programación en pasos pequeños más simples, se
puede dividir el trabajo en varios programadores o etapas, y se reduce la posibilidad de errores.
USERS
Figura 8. El procedimiento de diseño expresado como un diagrama de flujo.
SUBRUTINAS
En un programa que sigue una secuencia totalmente lineal, cada vez que se requiera
un proceso especial, por ejemplo un cálculo específico, se inserta el código que
realiza dicho cálculo o proceso. Esto representa la repetición del fragmento de código
cada vez que se necesite, lo cual ocupa mucho espacio en la memoria de programa,
dificulta un poco la lectura y, sobre todo su modificación o depuración.
Subrutinas
USER 93
6. TÉCNICAS DE PROGRAMACIÓN EN ENSAMBLADOR
Programa:
el mismo
veces
programa
Proceso x
Proceso x
Proceso x
Para hacer los programas más cortos y más eficientes, se hace uso de subrutinas. Una
subrutina es una parte de código separado del cuerpo principal del programa que lleva
a cabo un proceso definido, y al cual se puede acceder en cualquier parte del programa
mediante un llamado a subrutina. Como ya estudiamos, los llamados a subrutina se
realizan mediante la instrucción call.
94 USERS
S
Cuando llamamos a una subrutina, se realiza un salto hacia la dirección donde
comienza la subrutina con el código necesario para llevar a cabo el proceso que se
requiera. Una vez que se ha completado, se regresa a la siguiente instrucción después
del llamado, es decir, a la siguiente instrucción después del call que llamó a la
subrutina, y el programa principal continúa ejecutándose. El regreso de la subrutina se
hace automáticamente mediante la instrucción return, por lo tanto, todas las subrutinas
deben terminar con la instrucción return (o retlw). Se puede llamar a la subrutina todas
las veces que sea necesario. De esta forma, el código de la subrutina sólo estará una
vez. Y por supuesto, en el programa puede haber más de una subrutina. Un programa
con una subrutina en él puede verse de la siguiente forma:
inicio ;L1ama a la subrutina llamada proceso
;Regresa de la subrutina en esta instrucción
call proceso
;L1ama a la subrutina llamada proceso
;Regresa de la subrutina en esta instrucción
call proceso
;lnicia la subrutina llamada proceso
return
subritina
END
Subrutinas anidadas
Como hemos señalado, las subrutinas se pueden llamar en cualquier lugar del
programa donde se necesite, incluso se puede llamar a una subrutina dentro de
otra. Este proceso se conoce como subrutinas anidadas.
USER 95
Subrutinas
Cuando se llama a una subrutina dentro de otra, la última debe regresar al punto
posterior al que fue llamada, y así hasta salir de la primera subrutina que contiene los
llamados a las demás, y de esta forma regresar el control al programa principal.
Controlador de programa
pila
Memoria
de programa
• Cuando el programa encuentra por primera vez una instrucción call, suceden dos
cosas: la primera es que la instrucción call ocasiona que se escriba el valor actual del
contador de programa más uno (PC+I) en la pila; la segunda es que se coloca la
dirección indicada en la instrucción call en el contador de programa (PC).
• De esta forma se provoca un salto hacia la dirección de la memoria de programa
donde empieza la subrutina y ésta comienza a ejecutarse.
• Si dentro de la subrutina actual hay un llamado a otra subrutina, la nueva instrucción
call coloca el valor actual del PC+I en la pila. Esto provoca que el valor anterior
quede debajo de este último en la pila. Y nuevamente hace el salto hacia la dirección
donde está la nueva subrutina.
• Si ya no hay más llamados a subrutina, la subrutina actual se ejecutará hasta
encontrar la instrucción return, que indica el regreso de esta subrutina. La instrucción
return hace que se tome la última dirección colocada en la pila, entonces se realiza el
salto hacia esa dirección, y ahora sólo queda una dirección en ella.
• Como ya salimos de una subrutina, estamos ahora en la primera, y al encontrar la
instrucción return, ésta tomará el valor que queda en la pila y saltará hacia esa
Como hemos mencionado, la pila del PIC16F84A sólo tiene 8 niveles, por lo que sólo podemos
colocar 8 direcciones en ella. Si intentamos colocar una novena dirección, ésta sobrescribirá la
USER 97
6. TÉCNICAS DE PROGRAMACIÓN EN ENSAMBLADOR
primera dirección en la pila. y se producirá un desbordamiento, lo que implica que hemos perdido
una dirección y el programa se saldrá de control debido a esto.
En la Figura 13 podemos ver gráficamente el proceso completo del funcionamiento de
las subrutinas. De esta forma debemos asegurarnos de no utilizar más de 8 subrutinas
anidadas, ya que la capacidad de la pila las limita a ese número.
SALTOS
Como aprendimos en el Capítulo 3, dentro del repertorio de instrucciones del
PIC16F84A tenemos algunas instrucciones de saltos, es decir, que llevan el programa
a un lugar diferente. Existen variados tipos de saltos y algunas técnicas para usarlos. A
continuación, veremos cuáles son.
Salto incondicional
La instrucción goto es un salto incondicional, es decir, no se requiere ninguna
condición para llevar a cabo el salto. En cualquier lugar donde se encuentre una
instrucción goto, el programa saltará al lugar donde la instrucción se lo indique. En el
código fuente los saltos indican el lugar a donde saltarán mediante etiquetas.
98 USERS
Saltos
lee datos
PORTA, W
movf procesol
goto
PORTB
procesol mow,'f
call goto proces02 retardo
goto proces02
lee_datos
El operador $
El operador $ devuelve el valor del contador de programa (PC) y puede ser útil para
definir saltos sin usar etiquetas. Dado que $ devuelve el PC, se puede hacer una suma
o resta con él, para definir un salto hacia delante o atrás. Por ejemplo en este código:
aquí
Se genera un bucle que no sale de la instrucción goto. Si usamos el operador $
entonces lo podríamos hacer simplemente así:
99
6. TÉCNICAS DE PROGRAMACIÓN EN ENSAMBLADOR
USERS
Saltos condicionales
Un salto condicional es aquél en donde se lleva a cabo el salto sólo cuando una
condición se cumple. En estos saltos hay una bifurcación del programa dependiendo
de si la condición puesta se cumple o no, y el programa seguirá caminos diferentes.
Si la condición no se cumple, se
ejecuta esta instrucción.
La instrucción puede ser un
salto incondicional enviando el
flujo del programa a otro lugar.
Si la instrucción no es de salto,
se ejecuta y luego se ejecuta
la instrucción 2.
Si la condición se cumple,
se salta la instrucción 1 y
se ejecuta directamente
esta instrucción.
100
Saltos
USERS
En la Figura 15 tenemos una explicación gráfica detallada del funcionamiento
de la instrucción decfsz. La instrucción incfsz es exactamente igual, excepto que
en ésta se hace un incremento (f f +1) en lugar de un decremento (f f - 1). En
ambas instrucciones hay un salto que evita una de las instrucciones cuando la
condición de que el registro llega a O se cumple. Estas instrucciones son
típicamente usadas para crear lazos o bucles que se ejecutan un número
determinado de veces, como veremos más adelante en este capítulo.
Ejemplo
de
La
el
Si la
se ejecuta
Si la
se
y se ejecuta
Registro f
De esta forma, podemos crear saltos condicionales en base al valor de un solo bit de
cualquier registro de la memoria de datos, incluyendo los registros de la zona SFR y
GPR. El valor del bit verificado no se altera en la ejecución de la instrucción. La
instrucción btfsc funciona de manera idéntica, excepto que en ésta la condición a
cumplir es que el bit verificado sea O en lugar de l .
101
6. TÉCNICAS DE PROGRAMACIÓN EN ENSAMBLADOR
USERS
Comprobar si un registro contiene cero
Los saltos condicionales en base a bits pueden servirnos para hacer pruebas y
comparaciones con registros. Veamos una técnica para determinar si un
registro contiene un valor O o no. Esto se logra mediante la prueba del bit Z en
el registro STATUS, que ya estudiamos antes.
El contenido del
registro es cero,
sigue este camino
El
Figura 17. Se utiliza la instrucción btfss con el bit Z del registro STATUS
para comprobar si un registro contiene el valor O.
102
Saltos
movf registro, F
btfss STATUS, Z
goto noCero
escero
nocero
USERS
Los
103
6. TÉCNICAS DE PROGRAMACIÓN EN ENSAMBLADOR
USERS
104
Saltos
•••(regl - reg2)
105
6. TÉCNICAS DE PROGRAMACIÓN EN ENSAMBLADOR
iguales, por lo que si necesitamos saber si son iguales, debemos llevar a cabo la
comprobación de O. El código de comparación de dos registros sería como este:
Para la comprobación de registros iguales, se puede usar la operación XOR (xorwf) en lugar de la
resta (subwf) y obtener el mismo resultado. Si hacemos una operación XOR entre los bits de
ambos registros. el resultado será todos los bits a 0. si los registros son iguales, y cualquier otro
diferente de O si no lo son.
USERS
BUCLES O LAZOS
Dentro de nuestros programas hay ocasiones que necesitaremos que una parte de
las instrucciones se repitan o ejecuten varias veces consecutivas. A este tipo de
proceso se lo denomina lazo o bucle (en inglés se puede llamar loop) ya que es la
repetición de una sección de código mediante un salto hacia atrás. De esta forma
se vuelven a ejecutar las líneas de código anteriores. A continuación veremos
cuáles son los distintos tipos de bucles que podemos utilizar en nuestros
programas.
Bucles infinitos
Un bucle infinito es aquél en el que se entra en determinado punto del
programa pero ya no puede salir de él. Este bucle se ejecutará siempre,
repitiendo una y otra vez las instrucciones que se encuentren en él. El bucle
será infinito siempre y cuando no haya dentro suyo alguna instrucción que lo
haga salir, por ejemplo, un salto hacia otro lugar fuera del bucle.
106 USERS
Figura 20. Un salto incondicional hacia atrás con
la instrucción goto puede generar un bucle infinito.
Bucles o lazos
{
BUCLES INFINITOS NO DESEADOS
1
Un claro ejemplo de un bucle infinito es el que utilizamos en Mi primer programa.
Si analizamos de nuevo su funcionamiento, podemos darnos cuenta de que hay un
bucle infinito al final. En él, el programa queda encerrado en el proceso de leer los
datos que entran por el Puerto A y los envía al Puerto B. Como está repitiéndose
constantemente, entonces siempre monitoreará los cambios en la entrada y los
reflejará a la salida.
107
6. TÉCNICAS DE PROGRAMACIÓN EN ENSAMBLADOR
Figura 21. Un bucle infinito permite ejecutar
constantemente el mismo grupo de instrucciones en nuestros
programas.
Bucle condicional
Podemos utilizar las instrucciones de salto condicional para generar bucles
condicionales, es decir, que se repiten hasta que una condición se cumple y
entonces el flujo del programa sale del bucle. Veamos un ejemplo.
Los bucles infinitos no siempre son deseados en la programación (en cualquier tipo de lenguaje
o aplicación). Es común cometer algún error durante la escritura del programa y generar, sin ser
intencional ni darse cuenta. un bucle infinito en él. en el cual el programa queda atrapado, y por
ende no funciona como debería.
USERS
El salto en esta
Instrucciones
108 USERS
obliga a tener un estado alto en él. Obviamente el pin RA4 debe ser configurado
como entrada.
Bucles o lazos
pulsador
btfss
goto
goto
PORTA, 4
proceso
proceso pulsador
Bucles fijos
Los bucles fijos son los que sólo se llevan a cabo un número fijo de veces y luego
salen para continuar el flujo del programa. Para estos bucles se utiliza la instrucción
decfsz o incfsz. De esta forma, se carga un número en algún registro que será quien
se decremente o incremente, hasta llegar a 0, y cuando esto suceda se saldrá del
bucle. Los bucles fijos son típicamente utilizados como retardos, para detener por
109
6. TÉCNICAS DE PROGRAMACIÓN EN ENSAMBLADOR
algún tiempo el flujo del programa, y es precisamente el tema que estudiaremos a
continuación.
USERS
RETARDOS
Generalmente, la frecuencia de reloj usada en nuestro microcontrolador será muy
alta, por lo que las instrucciones de nuestro programa se llevan a cabo de forma
muy rápida. En ocasiones podemos requerir el retraso de algunos procesos para
poder ver los efectos que causan o porque necesitamos que así sea. Esto se logra
mediante retardos, que no es otra cosa que mantener ocupado al
microcontrolador durante algún tiempo antes de que continúe con los procesos
siguientes.
110 USERS
Ciclo de reloj y Ciclo de máquina
para un oscilador de 4MHz
Ciclo de reloj = 0,25us
1 = 0,25ps
f 4MHz
Donde:
T = Período de la señal de reloj f
= Frecuencia de la señal de reloj
111
6. TÉCNICAS DE PROGRAMACIÓN EN ENSAMBLADOR
— 4T 4 (0,25ps) = IH
Donde:
M = Ciclo de máquina
EL ALCANCE DE CALL
Podemos darnos cuenta de que la ejecución de cada instrucción es muy rápida y en
gran número de ocasiones necesitaremos que el microcontrolador "espere" un poco
antes de continuar con los procesos siguientes. Imaginemos esta situación: necesitamos
diseñar un programa que nos muestre en el puerto de salida una cuenta de 1 a 10, por
dar un ejemplo. Es fácil: sólo colocamos un valor de 1 en un registro, lo enviamos al
puerto de salida para visualizarlo, luego incrementamos el registro y lo enviamos de
nuevo al puerto de salida. Pero debemos tener en cuenta que el tiempo de ejecución de
las instrucciones es muy corto, e incluso el tiempo de ejecución del programa
completo también lo es, por lo que los cambios en el puerto de salida serían demasiado
rápidos como para poder verlos. Es entonces cuando necesitamos "retardar" el envío
de los datos de tal forma que sean lo suficientemente lentos como para apreciarlos.
La instrucción call coloca la dirección del salto directamente en los once bits más bajos del contador
de programa (PC), con lo cual esta instrucción puede acceder a cualquier dirección de memoria en
un rango de 2048 bytes (2 KB). Aunque, como sabemos, el PIC16F84A tiene sólo 1024 bytes (1 KB)
de memoria de programa.
112 USERS
Retardos
USERS
Instrucción
5 1 nop nop microsegundos de retardo
nop nop Figura 26. La instrucción nop nos proporciona períodos de
nop retardo de unos cuantos microsegundos.
Instrucción
2
AJUSTE DE TIEMPOS
En la Figura 27 tenemos el diagrama de flujo de una subrutina de retardo con bucle
simple. La subrutina puede ser escrita de esta forma:
113
6. TÉCNICAS DE PROGRAMACIÓN EN ENSAMBLADOR
Podemos observar cómo funciona el retardo y cómo calcular el tiempo que durará
según el valor de K, que es cargado en el registro contador. El tiempo que dura este
retardo se calcula con la ecuación:
M = 6K+ 5
USERS
114 USERS
Retardos
Donde:
M = Ciclos de máquina
K = valor que cargaremos en el registro
El tiempo máximo para este retardo está dado cuando colocamos un valor de 0 en K,
puesto que al realizarse el primer decremento, el valor del registro pasará a 255, y de
esta forma el decremento del registro se llevará a cabo 256 veces:
Nos dará un retardo máximo de 1541 microsegundos ó 1.541 milisegundos con este
retardo para una frecuencia de reloj de 4 MHZ. Si necesitamos tiempos de retardo aun
más largos debemos recurrir a otra técnica.
Las instrucciones de salto modifican el valor que contiene el contador de programa (PC), por lo que
después de cualquier instrucción de salto, el programa continuará a partir de la nueva dirección que
115
6. TÉCNICAS DE PROGRAMACIÓN EN ENSAMBLADOR
contiene el contador de programa. Todas las instrucciones que modifican el contador de programa
directamente requieren de 2 ciclos de máquina para ejecutarse.
retardo
movlw
movwf
bucle 2
nop
USERS
Retardos
USERS
Por supuesto, podemos seguir anidando bucles o lazos para lograr tiempos aun
mayores. Esto dependerá de lo que necesitemos en cada programa en particular.
117
6. TÉCNICAS DE PROGRAMACIÓN EN ENSAMBLADOR
USERS
Retardos
USER 119
6. TÉCNICAS DE PROGRAMACIÓN EN ENSAMBLADOR
El programa que estamos estudiando puede resultarnos sumamente útil para calcular nuestros
retardos, pero no es el único. Por ejemplo, si vamos al sitio www.golovchenko.org/cgi-bin/delay
Retardos
encontraremos otro calculador de retardos gratuito que podemos usar en línea. El funcionamiento
es muy parecido al PIC delayer.
USERS
Rebotes en pulsadores
En la mayoría de nuestros proyectos necesitaremos el uso
USER 121
6. TÉCNICAS DE PROGRAMACIÓN EN ENSAMBLADOR
Con este choque mecánico, la señal que se obtiene rebota entre los dos estados y
produce efectos no deseados en nuestro circuito, ya que es como si se presionara el
pulsador muchas veces. Para resolver este problema existen métodos llamados por
hardware, que son circuitos anti-rebotes que evitan este efecto.
USER 123
6. TÉCNICAS DE PROGRAMACIÓN EN ENSAMBLADOR
USERS
Los pulsadores 0 teclados de prácticamente todos los aparatos 0 circuitos electrónicos deben llevar
alguna técnica anti-rebotes (debounce). Algunos usan la de hardware, es decir, un circuito que
permite eliminar o minimizar el efecto de rebote en la señal. La técnica por hardware se usa sólo
cuando no es posible hacerlo por software.
Retardos
Debemos tener en cuenta que el tiempo de los rebotes del pulsador depende
de varios factores, entre los cuales están el tipo de pulsador utilizado y la fuerza
que se ejerce al presionarlo. Pero, en general, el tiempo en que ocurren los
rebotes está entre 20 y 30 ms aproximadamente.
Un contador binario
Veamos un sencillo ejemplo de la aplicación de los retardos, anti-rebotes y
subrutinas. Para esto, armaremos un contador binario controlado por un pulsador
conectado al pin RAO y 8 leds conectados como salida en el Puerto B.
Así, cada vez que presionemos el pulsador, la cuenta se incrementará en los leds
conectados como salida. El diagrama de flujo sería como el de la Figura 37.
Como sabemos, puede haber problemas si colocamos las tablas más allá de los primeros 256 bytes
de la memoria de programa. Sin embargo, es posible colocarlas en cualquier lugar mediante el uso
de una técnica especial. Si necesitamos implementarla podemos descargar del sitio web
www.microchip.com la nota de aplicación AN556 Implementing a Table Read.
USER 125
6. TÉCNICAS DE PROGRAMACIÓN EN ENSAMBLADOR
USERS
Retardos
Figura 37. Detalle del funcionamiento para nuestro contador con anti-rebotes.
PROCESSOR 16F84A
#INCLUDE
CBLOCK OXOC
cuenta
127
6. TÉCNICAS DE PROGRAMACIÓN EN ENSAMBLADOR
USERS
Tablas
co 1
O como entrada
Puerto B como salida
co 0
-rebotes 30ms
129
6. TÉCNICAS DE PROGRAMACIÓN EN ENSAMBLADOR
USERS cont2
En el archivo
movwContador binario.asm, que podemos descargar de www.redusers.com,
tenemos cont2, para poder estudiarlo. En el ejemplo se usó una subrutina
el código fuente
f buclel
de retardo unos contl
degoto
decfsz 30 ms, para eliminar los rebotes del pulsador. Tenemos también
el archivo Contador binario.hex para grabarlo en el PIC y comprobar su
decfsz goto
funcionamiento.
return
END
TABLAS
El manejo de tablas grabadas en la memoria de programa (comúnmente llamado
tablas en ROM) puede ser muy útil en ciertos casos en donde se debe disponer de
una tabla para convertir códigos, para resolver tablas de verdad y otras tareas.
Salto indexado
EL SALTO INDEXADO Y EL CONTADOR DE PROGRAMA
Los saltos indexados se llevan a cabo con la instrucción addwf PCL, F para realizar
un salto específico que depende del valor de W. Observamos cómo la instrucción
de suma addwf lo que hace es sumar el valor que contenga W al registro PCL que,
como ya vimos, es el registro correspondiente a los 8 bits más bajos del contador de
programa (recordemos que éste es de 13 bits). Y de esta forma se obtiene una
dirección nueva a donde se saltará. El valor contenido en W que controlará el salto
se llama offset.
USERS
Tablas
PCL PCL
movlw d'2'
OAh
addwf PCL,F
xxh Instrucción x
Manejo de tablas
Ahora, si combinamos el salto indexado con la instrucción retlw, que es un retorno de
subrutina similar a retum (pero con la diferencia de que retlw coloca un valor en el
registro W antes de regresar) tendremos una tabla de datos. Una tabla nos permite
obtener datos de una lista dependiendo del valor del offset que coloquemos en W.
Las tablas de verdad, como ya sabemos, se usan para diseñar circuitos combinacionales con
compuertas lógicas. Mediante la resolución con tablas en ROM nos damos cuenta de que, si lo
deseamos, podemos sustituir dicho circuito combinacional por un microcontrolador, siendo más
fácil y rápido de diseñar e implementar.
192
Nos puede ser útil para resolver tablas de verdad. Veamos un ejemplo: supongamos
que tenemos que resolver una tabla de verdad, como la que vemos en la Tabla I, en
De esta forma, el offset estará dado por las entradas, y las salidas se obtendrán
de la tabla. Podemos usar el mismo circuito de Mi primer programa que ya
estudiamos, pero en este sólo se usarán tres de los interruptores conectados al
Puerto A. El programa sería algo similar a esto:
; Programa principal:
inicio
USERS
Tablas
USERS
movf PORTA, W ;Lee los datos del Puerto A andlw b' 00000111
' ;Obtiene solo los tres primeros bits call tabla ;L1ama a tabla
para obtener el valor
correcto movwf PORTB vez obtenido el valor lo envía al
Puerto B
goto inicio ;Crea un bucle infinito
retlw b ' 00010100 ' ; Valor de salida para la entrada 000 retlw b '
00001010 ' ; Valor de salida para la entrada 001 retlw b' 00001100;
Valor de salida para la entrada 010 retlwb 00000101 ; valor de salida para
la entrada 011 retlw b ' 00011010' ; valor de salida para la entrada
100 retlwb ' 00001110' ; Valor de salida para la entrada 101 retlw b
00010100 ; Valor de salida para la entrada 110 retlw b ' 00001001
; valor de salida para la entrada 111
END
La directiva DT
Si queremos simplificar el manejo de tablas podemos hacer uso de la directiva DT
(Define Table). Su sintaxis es la siguiente:
Cada expr es un valor que estará en la tabla generada por la directiva. La directiva DT
generará automáticamente, al momento de ensamblar, la lista con los respectivos
retlw por cada expr que coloquemos. Por ejemplo:
133
6. TÉCNICAS DE PROGRAMACIÓN EN ENSAMBLADOR
USERS
Tablas
La directiva DT es muy útil para definir caracteres o cadenas de código ASCII cuando
lo necesitemos. Por ejemplo:
en código ASCII en
DT "PIC" a: código ASCII en código
ASCII
OX50
Es equivalente
0x49
retlw 0x43
retlw
retlw
0 a esto:
retlw
retlw
retlw
De esta forma, como vimos en el ejemplo anterior, mediante la directiva DT, es más
fácil construir tablas en nuestros programas.
Las tablas están grabadas en la memoria de programa, por eso se las llama tablas en
ROM y hay que tener en cuenta que los datos en ellas son fijos, no se pueden
modificar, a menos que se grabe de nuevo el microcontrolador.
USERS 135
6. TÉCNICAS DE PROGRAMACIÓN EN ENSAMBLADOR
puede leer y escribir directamente, pero el registro PCH no, por lo que debe
escribirse mediante el registro PCLATH (PC Latch High).
Instrucciones con PCL como destino:
PCH PCL
12
8 7
0
PCLATH
Al ejecutar la instrucción addwf PCL, F (o cualquier otra que tenga PCL como destino)
realmente se estará escribiendo en todo el contador de programa, ya que PCL se
escribirá directamente en los 8 bits más bajos del contador de programa y
simultáneamente el registro PCLATH se escribirá en el registro PCH. Como el registro
PCLATH toma el valor de 0 ante cualquier reset, si sólo modificamos el registro PCL,
entonces únicamente podremos trabajar en los primeros 256 bytes de la memoria de
programa, ya que PCLATH siempre tendrá el valor O mientas no lo modifiquemos. Por
ejemplo, este fragmento de código no funcionará correctamente:
ORG tabla
movlw
call 0x100 ; Más allá de los 256 bytes
retlw d'
retlw IO' d
retlw ' 11'
d'
12'
El origen de la tabla de datos está más allá de los primeros 256 bytes (100 h) de la
memoria, por lo que la instrucción addwf PCL, F sólo modificará los primeros 8 bits
USERS
Tablas
del contador de programa, lo cual producirá un salto hacia alguna dirección dentro de
estos primeros 256 bytes y el programa no funcionará.
El segundo punto a tener en cuenta es que si la tabla está en una posición cercana al
límite de los primeros 256 bytes de la memoria de programa, al realizar la suma del
PCL más W el registro PCL puede desbordarse. Y, de la misma forma, al no
modificarse el PCH adecuadamente, el salto no será correcto y el programa no
funcionará. Veamos un ejemplo de esto:
ORG movlw OOh
call d'l' origen esta en la dirección O
tabla ;Define el offset para el salto
;Regresa con el valor "B" en W
movlw call
;Define el offset para el salto
tabla
regresa.. .
el segundo salto, el offset tiene un valor de 3, por lo que al sumar el PCL+3 el registro
PCL se desbordará, y como el registro PCH no se incrementa, entonces PCH=OOOOO
y PCL=OOOOOOOI. Por lo que el segundo salto se hará a la dirección 01 h en lugar
de hacerlo a la dirección 101 h y el programa ya no
funcionará correctamente. En este ejemplo hemos colocado
deliberadamente la tabla en un lugar no adecuado para
poder ver el efecto. Por eso, se recomienda colocar las
USERS 137
6. TÉCNICAS DE PROGRAMACIÓN EN ENSAMBLADOR
UN DADO ELECTRÓNICO
Con las técnicas de programación estudiadas hasta el
momento, ya podemos comenzar a diseñar circuitos con el
microcontrolador PICI 6F84A. Veamos cómo diseñar y armar
un dado electrónico. En primer lugar debemos definir
nuestro circuito.
USERS
Tablas
USERS 139
Librerías de subrutinas
LIBRERÍAS DE SUBRUTINAS
Como ya estudiamos en el Capítulo 4, podemos usar la directiva #INCLUDE para
incluir otros archivos y al momento de llevar a cabo el ensamblado la directiva
literalmente pegará el contenido del archivo en el lugar indicado. Esto nos resultará
muy útil para crear librerías de subrutinas. Muchas subrutinas que diseñemos serán
utilizadas en muchos de nuestros programas, por lo que es conveniente armar una
librería de subrutinas para hacer más fácil y rápida la escritura de nuestros programas.
Para crear una librería sólo basta con crear un archivo nuevo en el editor de MPLAB y
ahí escribir la subrutina deseada. Al tener el archivo con la subrutina en MPLAB lo
guardaremos como un archivo *.INC y de esa forma ya tenemos nuestra librería lista
para usar. Pero debemos seguir algunas reglas importantes para escribir librerías:
• Las librerías se escriben como cualquier programa, por lo tanto, deben especificar
sus propias constantes, Esto debe hacerse mediante la directiva CBLOCK y hay que
usar esta directiva también en el programa principal.
USERS 140
principal si vamos a incluir librerías que utilicen constantes. Si no empleamos
constantes en el programa principal debemos aún colocar la directiva CBLOCK:
141
6. TÉCNICAS DE PROGRAMACIÓN EN ENSAMBLADOR
PROCESSOR 16F84A
#INCLUDE
CBLOCK
OXOC cuenta
contl cont2
ENDC
;Configuración de puertos :
bsf STATUS, RPO ;Acceso al banco 1 movlw b ' 00000001 ' movwf TRISA
;Configura RAO como entrada clrf TRISB ;Configura el Puerto B como salida bcf
STATUS, RPO ;Acceso al banco O
142 USERS
Librerías de subrutinas
143
6. TÉCNICAS DE PROGRAMACIÓN EN ENSAMBLADOR
microcontrolador. Las técnicas aprendidas se utilizarán en prácticamente todos los
programas.
USERS
144 USERS
TEST DE AUTOEVALUACIÓN 11000011
10000001
I ¿Qué es un diagrama de flujo?
2 ¿Qué es una subrutina? Cada 100 ms aproximadamente, use
una tabla para generar el efecto.
3 ¿Cuál es la instrucción que se utiliza
para llamar a una subrutina? 3 Tome el retardo que diseñó en el punto 1
y genere una librería llamada RETARDOIS.
4 ¿Para qué sirve la pila en el INC siguiendo las pautas, para poder usar
PIC16F84A? este retardo en futuros programas como
librería.
00000000
0001 1000
001 1 1 100
11 100111
145
7. DISPLAY LED Y LCD
USERS
146
7. DISPLAY LED Y LCD
DISPLAYS LED DE 7
4
SEGMENTOS
Los displays de 7 segmentos nos serán
de utilidad en algunos proyectos en
donde se requiera mostrar números a
la salida. Un display de siete segmentos
es un elemento que contiene 7 barras o
segmentos en los cuales hay un LED en
cada uno de ellos. De esta forma, al
encenderlos selectivamente, se An
mostrarán números en él. com
Cátodo
Existen displays de ánodo común y de común
cátodo común, según la conexión de
los LEDs internamente. Es decir,
Figura I. Este display en los de ánodo
común, todos los ánodos de los LEDs
es útil para representar están
interconectados y en los de cátodo
común serán números mediante los
cátodos los que estén
interconectados. la iluminación de sus
LEDs.
USERS
148
Displays LED de 7 segmentos
En las tablas y ejemplos de éste capítulo hemos usado displays de cátodo común pero, por
supuesto, también pueden ser usados displays de ánodo común, sólo hay que conectarlos
correctamente e invertir los valores de salida con respecto a los mostrados, ya que en éstos el
segmento encenderá con un O y se apagarán con 1.
149
7. DISPLAY LED Y LCD
USERS
Aunque también se pueden representar otros caracteres, éstos son los principales. Si
necesitamos algún otro podemos generarlo al encender o apagar los segmentos
necesarios. En la Figura 4 se muestran las representaciones sólo para displays de
cátodo común.
150
Displays LED de 7 segmentos
USERS
151
7. DISPLAY LED Y LCD
CBLOCK
BCDcentenas
BCDdecenas
BCDunidades
ENDC
BINaBCD
movwf
clrf borra BCDunidades
decenas BCDcentenas
clrf BCDdecenas
convBCD
movlw
subwf d' IO'
btfss BCDunidades, F
goto STATUS, C
incf BCDfin
subwf
BCDdecenas,
btfss
goto
F
incf BCDdecenas ,
goto w STATUS, Z
BCDfin convBCD
BCDcentenas,
addwf
borra decenas ;Recupera el valor de las unidades
retur
;Regresa
n
BCDunidades, F
En la librería para la conversión de código binario a BCD, sólo se puede convertir como máximo un
número de 25510 ya que, como sabemos, esa es la capacidad máxima de los registros de 8 bits. Al
escribir nuestros programas que requieran esta conversión debemos tenerlo en cuenta.
USERS
Se llama a la subrutina BINaBCD, que devuelve el número convertido en los registros
BCDcentenas, BCDdecenas, y BCDunidades. En cada uno se almacena el número en
código BCD en el nibble bajo. En www.redusers.com tenemos la librería
BINABCD.INC.
152
Displays LED de 7 segmentos
Displays multiplexados
Si necesitamos conectar más de un display para representar más de un dígito y no
tenemos suficientes líneas en el PIC16F84A, podemos recurrir a la técnica de displays
multiplexados. En este caso, se conecta más de un display al Puerto B y se activa uno
a uno de forma muy rápida para dar la impresión de que todos están encendldos.
USERS
153
Displays LED de 7 segmentos
Contador de turnos
Veamos un ejemplo de una aplicación con displays multiplexados. Todos hemos
ido alguna vez a un banco o a un negocio donde debemos tomar un número y
luego esperar hasta que nos toque el turno para ser atendidos. En una pantalla
podemos ver el número de turno y a qué
ventanilla deberemos ir. Vamos a realizar
una de esas pantallas de un contador de
turnos.
El programa no tiene mayor dificultad, sólo hay que monitorear los pulsadores
y cuando uno de ellos es presionado, se aumenta el valor del turno y se
identifica el número de ventanilla. Luego se activan los displays de tal forma
que enciendan uno tras otro de forma rápida. Podemos descargar el código
fuente Contador de turnos.asm del sitio www.redusers.com para analizarlo y
comprender su funcionamiento. Está suficientemente comentado, y con lo que
hemos estudiado hasta ahora, no debemos tener mayores problemas para
entenderlo. También podemos descargar el archivo Contador de turnos.hex
para poder grabarlo en el PIC y comprobar el funcionamiento del circuito.
DISPLAY LCD
USER 155
7. DISPLAY LED Y LCD
son los basados en el controlador Hitachi 44780. Estos displays se pueden encontrar
en configuraciones de 1 línea de 16 caracteres (16x1), dos líneas de 16 caracteres
(16x2), o más, como 20x2 ó 40x4. Cada carácter está formado normalmente por una
matriz de puntos de
Figura 9. Apariencia física de un display 5x7. En nuestro caso estudiaremos el
de 2 líneas y 16 caracteres por línea. display de 16 caracteres por 2 líneas.
Algunos displays cuentan con una luz de fondo (back Light) para iluminar la pantalla y permitir
una mejor visualización, o poder hacerlo en la oscuridad. Algunos tienen dos pines que sirven
para la conexión de esta luz, y generalmente son LEDs. Es por eso que debemos consultar la hoja
de datos para la correcta conexión de estos pines de la luz de fondo.
USERS
Aunque el modelo LM016L es el más popular, podemos usar cualquier otro
que sea compatible con el controlador 44780. Este tipo de displays es ideal
para poder presentar caracteres y números, ya que su consumo de potencia
es muy reducido, lo que los hace ideales para el uso en circuitos alimentados
con pilas o que requieran poco consumo en su operación. Hablaremos
específicamente de los modelos con controlador Hitachi 44780, pero los
ejemplos y programas pueden adaptarse también a otros displays que
tengan un controlador compatible con éste, por ejemplo, los JHD162A que,
aunque tienen un controlador diferente (KS0066), funcionan de manera casi
idéntica.
156
Display LCD
R/W-I Lectura
Enable E-0 Deshabilita el display
E-1 Habilita el displa
7-14 DBO-DB7
USER 157
7. DISPLAY LED Y LCD
4 RS (register select): el display cuenta con dos registros internos en los cuales
podemos leer o escribir. El primero es el registro de datos (data register), que es
donde enviaremos los códigos de los caracteres que se mostrarán en la pantalla
del display. El segundo es el registro de instrucciones o comandos (instruction
register), el cual recibirá instrucciones para el control o configuración del display.
Mediante
USERS
el pin se selecciona en cuál de estos dos registros vamos a leer o escribir.
5 R/W (Read/Write): como en la mayoría de los dispositivos que contienen
memorias, podemos leer o escribir en ellos. Este pin nos permite seleccionar si
vamos a leer o escribir en el display.
6 E (enable): este pin habilita o deshabilita el display. Si ponemos un O en él,
deshabilitaremos el display y el bus de datos entra en el modo de alta impedancia.
Si colocamos un 1 habilitaremos el display para enviar o recibir datos.
7 a 14 DBO a DB7: estas 8 líneas son el bus de datos que usaremos para
escribir datos o instrucciones en el display, o leer datos de él.
158
Display LCD
Por ejemplo, para mostrar el carácter E debemos enviar el dato 01000101 al display.
Las casillas marcadas con números entre paréntesis pertenecen a la CGRAM
(Character Generator RAM) y son 8 espacios reservados para que el usuario pueda
crear sus propios caracteres y almacenarlos ahí.
S
La DDRAM
El display cuenta con una memoria RAM que se utiliza para almacenar los
caracteres que se muestran en la pantalla. Esta memoria es llamada DDRAM (Data
Display RAM) y tiene una capacidad de 80 bytes, dividida en dos bancos de 40
bytes cada uno, precisamente un banco por cada línea del display. En la Figura 13
podemos observar un diagrama de cómo se organiza la DDRAM.
25 26 27
65 66 67
Pantalla
USER 159
7. DISPLAY LED Y LCD
Línea 1
Figura 13. Organización de la DDRAM y su correspondencia con la pantalla del display.
Instrucciones o comandos
La comunicación entre el PIC y el display se hace a través de comandos y datos
para controlar su funcionamiento. En la Tabla 2 tenemos un resumen de los
comandos y la forma de enviar datos o leerlos del display, especificados por el
fabricante.
ACCIbN RS DB5 DB4 DB3 DB2 DBI DBO TIEMPO
O O O O
eturn home
Entry mode set
isplay control
unction set
Set CGRAM adress
160
Display LCD
USERS
A continuación, realizaremos una descripción detallada de cada uno de los
comandos que incluimos en la Tabla 2, para comprender mejor su
funcionamiento:
Clear display (borra display): borra la pantalla del display. Escribe 20h (espacio) en
todas las posiciones de la DI)RAM y coloca el cursor en la dirección ()Oh de la
DDRAM, es decir, en la primera posición de la primera línea de la pantalla.
Return home (regresa al origen): devuelve el cursor a la posición 0011 de la
DDRAM. Entry mode set (modo de entrada): movimiento del cursor y el display:
Bit 1/D (Increment or decrement ofDDRAM):
1/D=1 La posición del cursor se incrementa con cada escritura en la DDRAM.
1/D=O La posición del cursor se decrementa con cada escritura en la DDRAM.
Bit SH (Shifi):
SH=O Los caracteres no se desplazan al escribir uno nuevo en la pantalla.
SH=I Los caracteres se desplazan en la pantalla al escribir uno nuevo en la
DDRAM, en la dirección indicada por el bit 1/1).
Bit C (Cursor):
El cursor no se muestra.
El cursor se muestra.
Bit B (Blink):
No hay efecto en el cursor.
B=l El cursor parpadea y tiene forma rectangular.
o La
USER 161
7. DISPLAY LED Y LCD
La DDRAM es decrementada en 1
La posición del cursor es desplazada
La DDRAM es incrementada en
La DDRAM y el cursor se desplazan a la izquierda
S
Function set (función): este comando epecifica algunos parámetros de
configuración del funcionamiento del display, según los datos que especifiquemos
en él:
Bit DL (Data length):
DL=O Se usa una conexión de 4 bits.
DL=I Se usa una conexión de 8 bits.
Bit F (Font):
Fuente o caracteres de 5x7 puntos.
Fuente o caracteres de 5x10 puntos.
Write data to RAM y Read data from RAM (escribir o leer datos de la RAM): estas
dos últimas operaciones sirven para escribir o leer datos de la DDRAM.
162
Display LCD
El Busy flag
Como ya mencionamos, el bit llamado Busy flag es el bit 7 del bus de datos (DB7).
Este bit de ocupado nos dirá si el display está realizando algún proceso interno y si
es así, no podremos enviar otro dato o comando hasta que termine.
Existen dos modos de operar el display: con busy flag o sin él. Con busy flag
debemos leer este bit antes de enviar datos o comandos para ver su estado. Si es l, el
display está ocupado y debemos esperar hasta que se ponga a O para realizar otro
envío de datos. Si no queremos realizar la lectura del busy flag, podemos tomar los
tiempos de la Tabla 2. Así, podemos agregar un retardo mayor a este tiempo para
asegurar que la operación haya terminado. Si usamos el modo sin busy flag
podemos conectar el pin R/W del display directamente a tierra, ya que no
necesitaremos realizar operaciones de lectura, sólo de escritura, y así nos
ahorraremos el uso de una línea de salida en el PIC.
USERS
USER 163
7. DISPLAY LED Y LCD
164
Display LCD
USERS
un dato o comando. El modo de conexión de 8 bits es más
eficiente ya que permite una mayor velocidad. Pero la
principal desventaja del uso de 8 bits es que no nos
quedan muchas líneas libres en el PIC16F84A.
165
7. DISPLAY LED Y LCD
USERS
166
Display LCD
La principal ventaja que tenemos si utilizamos el bit de busy flag es que si monitoreamos el
estado de este bit, podemos enviar otro dato en cuanto nos lo indique. Si colocamos retardos
para no usarlo, puede que los procesos internos terminen mucho antes que el retardo. y eso
hace nuestro programa un poco más lento.
USERS
Los procesos de inicialización son informados por el fabricante y debemos
seguirlos para un correcto funcionamiento del display. Debemos incluir la rutina de
inicialización al comienzo de cualquiera de nuestros programas donde usemos el
display. Las x en los diagramas de flujo de inicialización indican que el estado de
esos bits no afecta y es indistinto.
167
7. DISPLAY LED Y LCD
USERS
En este ejemplo enviamos el comando Display control con diferentes opciones que
en el proceso de inicialización. En este caso se visualiza el cursor.
USERS
(ver la Tabla 2). Es por eso que no deben llamarse con la subrutina LCD_comando,
sino que tienen su subrutina especial que cumple con el tiempo de espera
adecuado:
169
7. DISPLAY LED Y LCD
borra_display
LCD_origen1
La primera subrutina permite borrar la pantalla y colocar el cursor en la primera
posición de la línea 1 de ésta. La segunda envía la posición del cursor a la primera
posición de la línea l, pero sin borrar el contenido de la DDRAM.
Los caracteres pueden darse mediante código ASCII, como en el ejemplo anterior,
pero en la tabla de caracteres de la CGROM podemos ver que de la posición 12610
lo tanto, para usarlos hay que poner directamente su código, ya sea en binario,
decimal o hexadecimal. Por ejemplo, para mostrar el símbolo de la raíz cuadrada
ponemos:
b'11101000'
LCD caracter
Las desventajas de usar el busy flag en programas que utilicen el display LCD, son que
usamos una línea más del PIC para poder leerlo. Además, si el display falla, puede que
nunca se libere el busy flag, provocando que el programa quede estancado esperándolo
y no funcionará más. Si no lo usamos, el programa seguirá funcionando aun si el display
no funciona.
USERS
Como ejemplo proponemos el siguiente programa que coloca exto en el display.
Se usa la librería para manejo de LCD de 8 bits LCD8BITS.INC, pero puede ser
también la de 4 bits, con la conexión adecuada del display al PIC16F84A. Nos sirve
para conocer la forma de enviar caracteres al display, para mostrar un mensaje en
él:
170
Display LCD
USERS
171
7. DISPLAY LED Y LCD
Mensajes en LCD
A continuación, veremos otra librería que nos permitirá mostrar mensajes en el
display de una manera muy fácil y práctica para los programas. Mediante el uso de
esta librería podremos mostrar mensajes de hasta 32 caracteres usando las dos
líneas de la pantalla. En el sitio www.redusers.com podemos obtener esta librería
llamada LCDMENSAJES.INC para su estudio y su uso.
mensajes
addwf
mensaje_l PCL, F
Debemos asegurarnos que las tablas queden dentro de los primeros 256 bytes
de la memoria de programa y terminar cada mensaje con ()()h, para indicar su
final. Estas dos condiciones son muy importantes. Luego de hacer esto
debemos colocar en el registro W la dirección (la etiqueta) del mensaje
deseado y llamar a la subrutina LCD_mensaje, como por ejemplo:
;Dirección del mensaje 2
mensaje_2
LCD_mensaje
De esta forma, la librería se encargará de borrar el display y mostrar el mensaje
indicado. Es importante no sobrepasar los 32 caracteres, ya que si lo hacemos el
mensaje no se verá completo. En la Figura 18 tenemos el diagrama de flujo de la
librería, que junto con el código fuente nos ayudará a entender su funcionamiento.
172
Display LCD
USERS
Figura 18. Proceso para mostrar mensajes de hasta 32 caracteres mediante tablas.
Como ejemplo del uso de la librería para mostrar mensajes en el display, podemos
descargar de www.redusers.com el archivo fuente Mensajes.asm. Además,
contamos con el archivo Mensajes.hex, para grabarlo en el PIC16F84A y
comprobar su funcionamiento. Se usa la conexión de 8 bits, tal como en la Figura
15.
173
7. DISPLAY LED Y LCD
USERS
174
PRÁCTICAS
de 7
I Escriba el programa que está al final
de la sección Librerías de control de
LCD en
MPLAB. Ensámblelo, y grábelo en el
? PIC16F84A para comprobar su
funcionamiento.
se
2 Diseñe un programa que muestre un
mensaje de hasta 16 caracteres en la
segunda
ays línea del display.
175
8. EL TIMER O
del Puerto A. Diseñe un programa que muestre el nombre del pin del pulsador
presionado, sólo mientras éste se mantiene presionado.
176 USERS
USERS
8. EL TIMER O
178 USERS
EL TIMER O DEL PIC16F84A
El PICI 6F84A cuenta con un temporizador/contador denominado Timer 0, que es
básicamente un contador binario ascendente de 8 bits, que se incrementa de dos
formas posibles: una de ellas depende del oscilador del sistema y la otra de la señal
entrante en el pin Precisamente de ahí el nombre TOCKI, que
significa Timer O Clock In. Cuando se usa con la señal externa se puede
incrementar ya sea con flanco de bajada o subida, según lo decida el usuario.
Si bien nos puede parecer que el Timer O es una función muy sencilla, pronto
descubriremos que puede sernos de gran utilidad en muchos proyectos.
8. EL TIMER O
Los registros relacionados con el TMRO
El 6F84A realmente tiene otro temporizador llamado WDT o Watch dog timer,
aunque éste tiene un propósito diferente al Timer 0, por lo que hablaremos de él más
adelante. El prescaler puede ser asignado a alguno de estos dos temporizadores.
Luego, en la Tabla 2, veremos los rangos en que puede ser dividida la frecuencia.
El registro TMRO
El registro llamado TMRO es el registro perteneciente al Timer 0. En él se reflejará en
todo momento la cuenta, es decir, el valor que tenga todo el tiempo el Timer O.
180 USERS
Como pudimos apreciar en la Figura 2, el registro TMR() está conectado al bus de
datos, por IO que podemos escribir en él o leerlo cuando necesitemos.
USERS
El registro llamado TMRO está ubicado en la dirección 01 h del banco O del área SFR
de la memoria de datos. Cuando usamos el Timer 0 como temporizador y cargamos un
nuevo valor en él, el siguiente incremento se retrasará dos ciclos de reloj.
El registro OPTION
El registro OPTION que se encuentra ubicado en la dirección 8111 en el banco 1 de la
memoria de datos tiene varios bits que sirven de configuración y control del TMR().
En la Tabla 1 tenemos la estructura de este registro.
Bit 7 Bit 6 Bit 5 Bit4 Bit3 Bit 2 Bit 1 Bit O
PS2, PSI, PSO (Prescaler rate select bits): estos bits sirven para definir el rango del
prescaler o divisor de frecuencia. En la Tabla 2 vemos en detalle los rangos del
prescaler para no cometer errores.
PS2 PSI PSO
TMRO WDT
En la Tabla 2 podemos observar que si colocamos los bits PS2, PSI y PSO a O, lo que obtenemos es
un prescaler de 1 :2 para el TMRO. Pero si no queremos dividir la frecuencia a la entrada del TMRO,
debemos asignarle el prescaler al WDT y de esa forma no tendrá ningún efecto en el TMRO y la
frecuencia del reloj no será dividida.
RA4/TOCKl
TOSE -
1
RA4/TOCKl
TOCS (TMRO Clock source select bit): con este bit se elige la forma con la que el
TMRO se incrementará:
Los bits 6 y 7 del registro OPTION REG son usados para otras tareas que no viene al
caso detallar ahora, ya que las analizaremos posteriormente.
El PIC16F84A sólo tiene un timer de 8 bits, denominado Timer O. Muchos otros microcontroladores
PIC tienen más de un timer, además de contar con diferentes características. Por ejemPIO. algunos de
esos timers son de 16 bits, tienen postscaler (además de prescaler), etcétera. Un ejemplo es el
PIC16F628A que tiene 3 timers, denominados Timer O, Timer 1 y Timer 2.
USERS
182 USERS
El registro INTCON
Este registro se usa principalmente para las interrupciones, de las cuales no nos
explayaremos aquí ya que le dedicaremos el Capítulo 10 para su desarrollo. Por
ahora sólo nos interesa conocer un bit de este registro que está en la dirección
()Bh del banco O y se repite en la 8Bh del banco l .
Bit 7 Bit 6 Bit 5 Bit4 Bit3 Bit 2 Bit 1 Bit O
Este registro, en realidad, tiene dos bits asociados al TMRO, pero por ahora sólo
estudiaremos uno de ellos:
TOIF (TMRO Overflow Interrupt flag bit): este bit nos indica el estado de
desbordamiento del TMR():
Cuando el TMRO se desborda, entonces que se activa el bit TOIF, este bit debe ser
borrado por software, es decir, no se borra automáticamente, sino que habrá que
ponerlo a O mediante la instrucción bcf cuando sea necesario. Es importante tener en
cuenta esto para que nuestros programas funcionen correctamente.
contador binario divide la frecuencia en dos en cada una de sus salidas al funcionar. Si llevamos
nuestra señal de reloj al contador y tomamos las salidas de éste, en cada una habrá una frecuencia
dividida en 2, 4, 8, 16, etcétera, y esto se aprovecha como prescaler.
183
8. EL TIMER O
PROCESSOR 16F84A
#INCLUDE
CBLOCK OXOC
ENDC
184 USERS
USERS
185
8. EL TIMER O
TMRO
BCD
mostrar el valor
que lee el TMRO
del LCD al
aW
para obtener el
o si las
10?
186
USERS
El timer 0 como contador
BCDdecenas, W
LCDdecenas
movf addlw
valor ASCII goto
NOdecenas
movlw valen
cero LCD caracter
LCDdecenas call
unidades movf addlw BCDunidades,
valor ASCII call return
#INCLUDE
LCD caracter
#INCLUDE
END
<BINABCD. INC>
<LCD4BITS. INC>
Podemos descargar el código fuente TMRO contador.asm donde hay más comentarios
del funcionamiento y, él código máquina TMRO contador.hex, desde www.
redusers.com para poder grabarlo en el PIC16F84A y comprobarlo.
Dentro de las instrucciones de los microcontroladores PIC existe una llamada option, la cual ya no
es recomendada para su uso, pero sigue siendo reconocida por el ensamblador. Es por eso que en
187
8. EL TIMER O
el archivo de definiciones P16F84A.INC el registro OPTION es definido como OPTION REG para
evitar que el ensamblador lo confunda con la instrucción.
USERS
del programa es muy sencillo, sólo envía constantemente el valor contenido en TMRO
al display para que sea visualizado. La subrutina LCD_decimaI convierte el valor de
TMRO a decimal, de tal forma que en el display podamos observarlo. Recomendamos
estudiar bien el funcionamiento de esta subrutina en el código fuente.
FRECUENCÍMETRO
Si usamos el TMR() como contador, lo primero que se nos ocurriría contar es
precisamente el número de pulsos de una señal. Si hacemos esto durante un segundo,
habremos medido la frecuencia de dicha señal y con esto podremos escribir un
programa que funcione como un frecuencímetro digital.
Durante el retardo
de un segundo, el
TMRO se
incrementa con
la señal de
entrada
El método es sumamente sencillo, pero la desventaja es que el TMRO del PICI 6F84A
es de sólo 8 bits, con lo cual únicamente podríamos medir frecuencias de hasta 255 Hz
ya que si el TMRO se desborda (cuenta más de 255) iniciará de 0 nuevamente. Para
188 USERS
resolver este inconveniente podemos usar un registro auxiliar para que cada vez que el
TMRO se desborde, éste registro auxiliar se incremente y de esta forma podamos
contar más allá de los 255 que limitan un registro de 8 bits. Veamos un ejemplo de un
frecuencímetro que mida señales de hasta IO KHz.
189
8. EL TIMER O
Figura 7. El segundo método básico para medir frecuencias más allá de 255 Hz.
USERS
190 USERS
Frecuencímetro
Figura 8. Método de conversión de binario a BCD de 16 bits.
De esta forma tenemos ya las bases para continuar con nuestro frecuencímetro, en el
cual, además de la librería para convertir de binario a BCD de 16 bits, también
usaremos la librería de manejo de LCD, ya sea la de 8 ó 4 bits. El código fuente es el
siguiente:
CONFIG CP OFF & WDT OFF PWRTE ON & XT OSC
&
PROCESSOR 16F84A
#INCLUDE
CBLOCK OXOC
191
8. EL TIMER O
bsf STATUS,RPO movlw b' 00101000' movwf OPTION REG ;TMRO como
contador, sin prescaler bcf STATUS,RPO ;Acceso al Banco O
; Programa principal:
movlw b' 10000101 ' call LCD comando ;Envía el cursor a la
posición 5 movlw call LCD caracter movlw 'z ' call LCD
caracter ;CoIoca la
leyenda "Hz" en el
LCD
Si queremos construir un frecuencímetro muy preciso y que mida altas frecuencias, podemos
descargar la nota de aplicación AN592 Frequency Counter Using PIC16C5x de www.microchip.com,
donde se describe un método para hacerlo. Así podremos medir frecuencias desde 50 Hz hasta 50M
Hz. El método es para los PIC16C5x, pero se puede adaptar fácilmente al PIC16F84A.
192 USERS
Frecuencímetro
USERS
BCD
BINaBCD16
;Obtiene los dígitos de la
LCD_origen1
la ;Envia el cursor del LCD al
línea
BCD5, F
;¿Digito 5 > 0?
STATUS, Z
;Si, sobre-rango
la over_range
;Registro auxiliar para eliminar
LCDaux
izquierda
tiempo de un solo pulso de la señal de entrada y calcular su frecuencia con la fórmula f=1/T.
193
8. EL TIMER O
LCD2
dígito BCD4 3, W
numeroaLCD
goto
enviaLCD3
movlw andwf BCD2 1 , W
call
STATUS, Z
LCD2 swapf enviaLCD2
andl LCDaux, 1
w enviaLCD2
btfss LCDaux, O
goto enviaLCD2
btfss espacioLC
goto D
btfss
goto espacio
call LCDI
LCDI movlw
andwf BCD2 1, W
call numeroaLCD inicio
goto
numeroaLCD
addlw valor
ASCII call LCD caracter
return
espacioLCD
movlw
call LCD caracter
194 USERS
Frecuencímetro
USERS
195
8. EL TIMER O
196 USERS
Frecuencímetro
cont 2, F
loop2
cont I ,
loopl
exacto
d' 25'
decfsz goto cont 1
decfsz goto ret aux
tiempo a un segundo
movlw movwf INTCON, 2
loop_aux nop btfsc
goto $+2 goto $+3
incf bcf decfsz cont I byte_alto, F
goto nop return INTCON, 2
#INCLUDE
#INCLUDE
loop aux
END
<BINABCD16. INC>
<LCD4BITS. INC>
USER 197
8. EL TIMER O
198 USERS
El Timer O como temporizador
Donde:
El tiempo en esta fórmula está dado en ciclos de máquina, por lo que debemos
multiplicar por el tiempo del ciclo de máquina que usaremos. Para el caso de un
oscilador de 4 MHz ya sabemos que el ciclo de máquina es de I microsegundo. Si el
prescaler es asignado al WDT, entonces tomará el valor de I en la ecuación. Se
suman dos para ajustar, ya que cuando cargamos un valor en el TMRO el siguiente
incremento se retarda 2 ciclos de máquina. Veamos un ejemplo. Vamos a calcular
el tiempo que le tomará desbordarse al TMRO si se le carga un valor inicial de 150
sin usar prescaler. De la ecuación anterior calculamos:
Así, para un oscilador de 4 MHz, el tiempo medido con este ejemplo será de 108
microsegundos. El tiempo máximo que podemos obtener es cuando asignamos el
prescaler en 1:256 y cargamos un 0 al TMRO, como vemos en la siguiente
ecuación:
USER 199
8. EL TIMER O
Como ejemplo del uso del TMR() como temporizador podemos hacer ahora lo
contrario al frecuencímetro que ya estudiamos. Ahora generaremos una señal
cuadrada
S
en alguna salida de nuestro microcontrolador. De la ecuación para calcular
podemos despejar carga, de modo que la fórmula quedará expresada de la siguiente
forma:
= 256 - tiempo - 2
Carga
prescaler
Supongamos que necesitamos generar una señal de 800 Hz a la salida del pin RA3,
y con un ciclo activo del 509/0, entonces el período de la señal será:
= 1.25ms
f 800
Si el ciclo activo es del 50%, entonces cada semiciclo debe durar la mitad, es
decir, 625 microsegundos. Debemos generar una señal que se mantenga en
alto 625 microsegundos y en bajo otros 625 microsegundos. Lo primero que
debemos observar es el valor adecuado del prescaler que debemos usar. Si
empleamos un prescaler de 1, el tiempo máximo que podemos lograr es de
258 microsegundos, lo cual es insuficiente; con un prescaler de 2 será de 514
microsegundos, lo cual también quedará corto, así que debemos usar un
prescaler de 4. Con esto calcularemos el valor de carga para el TMRO:
625 - 2 carga = 256 -
4
= 100.25
No podemos usar valores fraccionarios, por lo tanto usamos el valor más
cercano siempre hacia arriba, que en este caso es 101 decimal. Ahora
escribimos nuestro programa, que es el siguiente:
200 USERS
El Timer O como temporizador
ORG 0x00
bsf clrf movlw movwf temporizador bcf
return
END
STATUS,RPO TRISA b' 10000001 ' OPTION REG
STATUS,RPO
d' 101'
TMRO
INTCON , TOIF
valor calculado
;Se carga el TMRO con él
,'Borra la bandera de
USER 201
8. EL TIMER O
;Si, regresa
Para poner a prueba nuestro programa, podemos usar el circuito que desarrollamos
en la Figura 10. Además, podemos utilizar MPLAB SIM para comprobar los
tiempos obtenidos con el Stopwatch, tal como hemos estudiado antes. Recordemos
que para eso debemos ir al punto donde se invierte el valor de salida.
Para medir los tiempos mediante Stopwatch debemos ir al punto donde se invierte el
valor de salida (una instrucción después del bsfl, que es donde inicia un nuevo semiciclo
de la señal de salida. y a partir de ahí medir el tiempo hasta el próximo cambio en la
salida (después del bcf). Podemos colocar Breakpoints en esos puntos y presionar el
botón Run de MPLAB SIM.
202 USERS
El Timer O como temporizador
USER 203
El Timer O como temporizador
OPTION REG
movwf ;coloca
temporizador STATUS , RPO
bcf
llamado Timer O del PICI 6F84A, y sus aplicaciones típicas, como contador de eventos
externos, o como temporizador para lograr medir tiempo. Además, construimos un
frecuencímetro basado en el Timer O como contador. Aún nos falta estudiar la
interrupción asociada al desbordamiento del TMRO, pero esto lo haremos más adelante
204
USERS
IOEI bit TOIF debemos borrarlo por 6 Diseñe un programa para obtener una
serial en el pin RA3 de 1500 Hz exactos.
USERS
Otras funciones
del PIC16F84A
Existen otras funciones en el PIC16F84A que nos
pueden ser de utilidad para nuestros diseños. En
este capítulo estudiaremos el direccionamiento
indirecto, el Watch Dog Timer, el modo de bajo
consumo o sleep, los resistores de Pull-up del
Puerto B, la utilización de la memoria EEPROM
para almacenar datos y el uso de macros
206
DIRECCIONAMIENTO INDIRECTO
Hasta ahora hemos manejado el direccionamiento de forma directa, es decir,
en las propias instrucciones donde tenemos la dirección del registro de la
memoria de datos sobre el cual vamos a trabajar.
Memoria
de datos
registro
movwf
El registro FSR (File Select Register), que se encuentra en la dirección 04h del
banco O y se repite en la 8411 del Banco 1, es realmente un apuntador que sirve
para definir direcciones de memoria. El contenido del registro FSR es tomado, en
verdad, como una dirección. El registro INDF es un registro auxiliar, en donde se
reflejarán los datos a leer o a escribir con el método de direccionamiento
207
9. OTRAS FUNCIONES DEL PIC16F84A
indirecto. El registro INDF está en las direcciones 0011 y 8011 en ambos bancos
respectivamente, aunque realmente no es un registro físico. Para comprender
mejor su fincionamiento, veamos un ejemplo de cómo funciona el
direccionamiento indirecto.
Direccionamiento indirecto
208 USERS
CONFIG CP OFF & WDT OFF & PWRTE ON & XT OSC
PROCESSOR 16F84A
#INCLUDE
ORG 0x00
inicio movlw 11'20' ;Dirección última a escribir movwf FSR ;Se coloca en el apuntador
FSR loop movlw 11'78' dato a escribir movwf INDF envía a INDF decf FSR, F ;
Decrementa la dirección
USERS
END
De esta forma, podemos observar cómo se pueden escribir o leer datos de una serie
de registros consecutivos mediante el direccionamiento indirecto, simplemente al
incrementar o disminuir el contenido de FSR para ir accediendo a las direcciones
apuntadas por él y leerlas o escribirlas mediante el registro INDF.
209
9. OTRAS FUNCIONES DEL PIC16F84A
para que no se quede estancado en algún punto (de ahí la analogía con un perro
guardián).
Hasta ahora hemos desactivado el WDT en nuestros programas mediante la directiva __CONFIG.
Recordemos que, de manera predeterminada, el WDT está activado, por lo que si no lo
desactivamos expresamente, puede provocar muchos dolores de cabeza, sobre todo a los
programadores novatos, ya que los programas se reiniciarán constantemente sin razón
aparente.
El Watch Dog Timer
210 USERS
Figura 5. La instrucción clrwdt evita que el WDT
se desborde y provoque un reset a todo el
sistema.
Hemos mencionado que el tiempo del WDT (sin prescaler) es de aproximadamente 18ms. Esto
es porque el oscilador es del tipo RC y, como sabemos, este tipo de osciladores es algo inexacto
debido a varios factores, pero principalmente por la temperatura y las variaciones en el voltaje
de alimentación. Es por eso que el tiempo del WDT es aproximado y puede variar un poco.
USERS
211
9. OTRAS FUNCIONES DEL PIC16F84A
• El oscilador principal del sistema se detiene.
• El TIMRO deja de funcionar.
• Los puertos mantienen el mismo estado en el que se encontraban.
• El consumo de potencia se reduce mucho al suceder todo esto.
Ya mencionamos que uno de los factores que afectan la exactitud del WDT es la temperatura,
por lo que el tiempo de él depende de ese factor. Si descargamos la nota de aplicación AN828
del sitio web de www.microchip.com. encontraremos la descripción de una técnica para medir
la temperatura con el WDT del PIC16F84A para poder construir un termómetro basado en él.
Modo de bajo consumo (sleep)
212 USERS
registro STATUS para verificar cuál fue la causa de un reset que son los bits TO' y
PD'.
Tabla 1. Bits del registro STATUS para identificar los reinicios del sistema.
USERS
Los dos bits comentados anteriormente son de sólo lectura, es decir, el usuario no
puede escribir en ellos. El bit TC)' nos servirá para detectar si un reset ha sido
causado por el desbordamiento del WDT.
213
9. OTRAS FUNCIONES DEL PIC16F84A
Inicio
Inicializa LCD
El programa se detiene
aquí hasta que el WDT
se desborda provocando
que continúe
Figura 7. Un programa de ejemplo de cómo se sale del modo sleep mediante el WDT.
Modo de bajo consumo (sleep)
214 USERS
CONFIG CP OFF & WDT ON & PWRTE ON & XT OSC ; activad0<<<
PROCESSOR 16F84A
#INCLUDE
CBLOCK
OXOC
contador
ENDC
ORG oxoo
inicio clrf contador loop cali LCD_origenI movf contador, W addlw call LCD
caracter ; Muestra el número de la cuenta incf contador, F ; Incrementa la
cuenta sleep ;Pasa al modo de bajo consumo, hasta que el WDT se desborda
movf contador, W ;Cuando sale del modo de bajo consumo continúa aquí
sublw d'10' btfsc STATUS, Z ; ¿Ha llegado a IO? goto inicio ;Si, reinicia el
contador goto loop ;NO, continúa
END
USERS
215
9. OTRAS FUNCIONES DEL PIC16F84A
Se asigna el prescaler al WDT con un radio de l : 128, lo cual da unos 2.3 segundos
para que se desborde, por lo tanto, el contador se incrementará en ese intervalo de
tiempo. En el LCD se refleja la cuenta que sólo va de 0 a 9. Para probar este programa
simplemente debemos tener el LCD conectado al PIC16F84A mediante un bus de 4
bits. Notemos cómo no hay ninguna subrutina de retardo, ya que el tiempo de la
cuenta en este caso está controlado por el WDT.
Los resistores de Pull-up internos del PICI 6F84A se activan para no tener que colocar resistores
externos. Estos resistores internos se activan sólo cuando el Puerto B o algunas de sus líneas son
configurados como entradas. Cuando se configuran como salidas. los resistores de Pull-up se
desactivan automáticamente.
Resistores de Pull-up del Puerto B
216 USERS
Pero si colocamos pulsadores u otros elementos que requieran de resistores de
Pull-up en el Puerto B, podemos emplear los que tiene internamente,
conocidos como Weak Pull-ups. Esto significa que el Puerto B del PICI 6F84A
cuenta con resistores internos que podemos activar para no tener que usar los
resistores externos. Para activar los resistores de Pull-up internos debemos
hacerlo con el registro OPTION. tal como detallamos en la Tabla 2:
BIT 7 BIT 6 BIT 5 BIT 4 BIT 3 BIT 2 BIT O
RBPU' INTDEG TOCS TOSE PSA PS2 PSI pso rabia 2. El
bit RBPU' del registro OPTION habilita los
Weak Pull-ups.
USERS
217
9. OTRAS FUNCIONES DEL PIC16F84A
Esta memoria de tipo EEPROM se puede escribir y leer por el usuario y contiene
64 bytes, es decir, 64 registros de 8 bits cada uno. De todos modos, debemos
tener en cuenta que no se puede acceder directamente a la memoria EEPROM
de datos, sino que para escribir o leer en ella usaremos algunos registros del
área SFR en la memoria de datos del 6F84A.
cual los tiempos de escritura en estas memorias eran típicamente de 10 ms. contra los 4 ms del
PIC16F84A. Es decir, el tiempo de escritura se ha reducido más de la mitad.
218 USERS
La memoria EEPROM de datos
WR
ERR WREN WR
Bits 7 a 5: no implementados
219
9. OTRAS FUNCIONES DEL PIC16F84A
USERS
Bit O RD (Read control Bit): bit de control de lectura en la EEPROM de datos:
Escribe
dirección a
leer en EEADR
Bit RD = 1
Lee dato en
EEDATA
Fin
Inicio
EEADR = Dirección
a escribir
EEADATA Byte a
escribir
221
9. OTRAS FUNCIONES DEL PIC16F84A
USERS
Como podemos apreciar en el diagrama de flujo de la Figura 12, debemos seguir
algunos pasos para realizar la escritura de forma exitosa en la memoria EEPROM de
datos. El fabricante especifica una secuencia de inicialización de escritura como la
marcada en el diagrama, que es la siguiente:
movlw 11'55'
movwf EECON2 h'AA'
movlw
EECON2
movwf
bsf EECONI, WR
222 USERS
La memoria EEPROM de datos
La directiva DE
La directiva DE (Declare EEPROM Data Byte) nos sirve para guardar datos
iniciales en la memoria EEPROM de datos, es decir, para definir datos que se
grabarán en la EEPROM al grabar el PIC. Su sintaxis es:
223
9. OTRAS FUNCIONES DEL PIC16F84A
USERS
224 USERS
9. OTRAS FUNCIONES DEL PIC16F84A
DE exp
exp son los datos a grabar. Debemos especificar, también, la dirección de inicio
donde serán grabados los datos. El origen de la memoria EEPROM se especifica
con la dirección 210011, por ejemplo:
ORG 210011
DE 11'77' h'12'
DE VI O"
"Mi programa .
De esta forma, podemos especificar datos que serán grabados en la EEPROM junto
con el código máquina al momento de grabar el PIC. Como podemos apreciar,
tenemos la posibilidad de guardar cadenas de caracteres para especificar versiones de
programa, fechas, notas, o cualquier cosa que necesitemos. Los datos definidos con la
directiva DE se pueden leer posteriormente con un grabador de PICs, tal como ya
hemos visto. Si activamos la protección de código del P1C, el programa puede seguir
leyendo y escribiendo en la EEPROM de datos, pero al intentar leer el dispositivo
mediante un grabador, no se podrá leer la EEPROM de datos, ya que la protección de
código lo impide.
La EEPROM en MPLAB
En IMPLAB también podemos observar los datos que contiene la memoria
EEPROM de datos. Si vamos al menú View/EEPROM aparecerá una ventana
(Figura 13) donde se muestra el contenido de esta memoria.
00 01 os 08 ox
225 USERS
9. OTRAS FUNCIONES DEL PIC16F84A
PROCESSOR 16F84A
#INCLUDE
0x2100
DE "Mi programa EEPROM V 1 .0"
END
Figura 14. La ventana EEPROM con los valores definidos por la directiva DE.
La EEPROM en IC-Prog
Podemos comprobar que los datos asignados con la directiva DE se grabarán en la
EEPROM al momento de grabar el PIC. Si abrimos IC-Prog y luego abrimos en él el
archivo *.hex generado en el ensamblado de este ejemplo, aparecerán en la zona de
datos EEPROM precisamente los datos que hemos definido con la directiva DE y, de
esa forma, al grabar el P1C, también los grabará en la EEPROM de datos.
USERS
226
La memoria EEPROM de datos
Figura 15. IC-Prog grabará los datos en la EEPROM al momento de grabar el PIC
Lee EEPROM
Dirección 0011
Incrementa valor
Escribe
EEPROM
Figura 16. Con este método podemos contar las veces que se ha empleado un circuito.
227
9. OTRAS FUNCIONES DEL PIC16F84A
USERS
De esta manera, podemos saber cuántas veces se ha usado un circuito. El código
fuente sería algo similar a lo siguiente:
PROCESSOR 16F84A
#INCLUDE
CBLOCK OXOC
ENDC
ORG OOh
#INCLUDE <EEPROM.INC>
END
USERS
228
Macros
Figura 17. Podemos leer el conteo en la EEPROM con nuestro grabador e IC-Prog.
MACROS
Las macros son tareas automatizadas, es decir, podemos definir una serie de
instrucciones como una macro para utilizarlas en tareas rutinarias de forma más
fácil y rápida. Recordemos el uso de la directiva #DEFINE que ya estudiamos
antes, en donde podemos asignar una etiqueta a una instrucción, como por ejemplo:
De esta forma, hemos asignado una instrucción completa a una etiqueta. Así, cada
vez que escribamos bancol en nuestro código fuente, el ensamblador lo sustituirá
por la instrucción bsf STATUS, RPO. Con las macros podemos hacer algo muy
parecido, pero con la ventaja de que las macros nos permiten definir un conjunto
completo de instrucciones y directivas, y además admiten argumentos. Las macros
deben definirse al principio del código fuente de la siguiente manera:
229
9. OTRAS FUNCIONES DEL PIC16F84A
Expansión
macro
ensamblar
programa
Instrucción 1
Instrucción 2
Instrucción X
ENDM
Figura 18. Estructura del uso de macros en un programa.
MUEVE FF movf
MACRO regl , reg2
regl , W
USERS
230 USERS
Macros
movwf reg2
ENDM
En primer lugar tenemos la etiqueta que nombra a la macro. En este ejemplo hemos
colocado el nombre MUEVE_FF, para indicar que es una macro que moverá el
contenido de un registro a otro. Lo indicamos en mayúsculas para diferenciar una
macro de las instrucciones en minúsculas, pero también podemos escribirlo en
minúsculas. Luego, colocamos la palabra MACRO, que le indica al ensamblador
que estamos definiendo una macro, y luego vienen los argumentos necesarios, en
este caso dos registros que usaremos (reg I y reg2).
Luego se colocan las instrucciones que formarán la macro, en este caso sólo dos.
Observemos cómo los argumentos son asignados en las instrucciones. Esto es,
cuando invoquemos la macro en algún lugar de nuestro programa deberemos
especificar los nombres de los dos registros involucrados y serán insertados en el
cuerpo de la macro tal como indican los argumentos. Finalmente, concluimos con
ENDM. Esta definición debe colocarse al principio de nuestro código fuente o, al
menos, antes de invocar la macro en el programa. Para invocarla, lo haremos de la
siguiente forma:
contador, W
auxiliar
Y así hemos creado una macro para pasar el contenido de un registro a otro. En este
caso el contenido del registro contador se moverá al registro auxiliar.
231
9. OTRAS FUNCIONES DEL PIC16F84A
Por supuesto, en los argumentos podemos definir cualquier par de registros que
necesitemos y, de esta forma, nuestra macro nos permitirá automatizar esta tarea de
un modo muy sencillo, siempre que necesitemos hacerlo.
Veamos otro sencillo ejemplo de una macro, para cargar un valor al TMR():
MACRO carga carga
CARGA TMRO
TMRO
movlw
movwf
ENDM
Así, podemos cargar el TMRO con el valor definido por el argumento carga:
CARGA TMRO
d'65'
Los ejemplos anteriores son macros muy sencillas, pero nos sirven para
comprender su funcionamiento. Las macros también nos permiten automatizar
tareas complejas. Por eso, a continuación veremos otro ejemplo de un macro que
nos puede resultar de utilidad en nuestros programas.
USERS
232 USERS
Macros
En esta macro se hace la comparación de los registros definidos por los argumentos
regl y reg2 mediante la resta regl-reg2 y observando el resultado en las banderas Z
y C del registro STATUS. Si los registros son iguales, se saltará a la dirección
definida por el argumento regl igual_reg2, pero si el primer registro es mayor, se
saltará a regl_mayor_reg2 y, en caso de que sea menor, a regl_menor_reg2.
iguales
mayor
menor
233
9. OTRAS FUNCIONES DEL PIC16F84A
Librería de macros
Hemos colocado las tres macros estudiadas en una librería llamada MACROS.INC
que podemos descargar de www.redusers.com. De esta manera, podemos usar la
librería para invocar las macros en nuestros programas cuando lo necesitemos, sólo
debemos recordar incluir la librería MACROS.INC al principio del código fuente,
ya que de hacerlo al final del código, como con las librerías de subrutinas, al
ensamblar nos dará errores.
Podemos escribir nuestras propias macros para definir tareas a las que recurrimos
frecuentemente, por lo que es conveniente que ampliemos la librería de macros con
todas las que nos puedan ser útiles. La ventaja de usar macros es que no generan
código mientras no sean invocadas. La diferencia de usar macros en lugar de
subrutinas es que en las primeras no hay salto hacia la subrutina, sino que se
invocan en el mismo lugar donde son requeridas. Tampoco se usa instrucción de
retorno, ya que el programa sigue inmediatamente después de la macro. Debemos
recordar, también, que la diferencia con las subrutinas es que las macros se
expanden cada vez que son invocadas, es decir, los códigos que generen las macros
En este capítulo hemos aprendido el uso de algunas funciones del PIC16F84A, algunas
de ellas nos serán de gran utilidad en nuestros circuitos, como el uso de la memoria
234 USERS
Macros
USERS
235
leds y luego entrará en modo de bajo
TEST DE AUTOEVALUACIÓN
consumo (sleep), del cual ya no saldrá.
I ¿Qué es el direccionamiento indirecto?
2 ¿Para qué sirve el registro FSR? 2 Tome la librería BINABCD.INC y
convierta la rutina para la conversión
3 ¿Para qué sirve el registro INDF? de binario a BCD en ella en una macro,
que puede resultar útil para los
4 ¿Qué sucede cuando el WDT se desborda? programas en donde se usa la
conversión una sola vez.
5 ¿Cuál es el período del WDT sin usar
prescaler? 3 Tome la macro que generó en el punto
anterior y agréguela a la librería de
6 ¿Cuál es el período del WDT si le macros MACROS.INC
asignamos un prescaler de 1:32?
4 Diseñe y agregue a la librería de
7 ¿Para qué sirven los resistores de Pull-up macros todas las macros que se le
internos del Puerto B? ocurran y que le puedan ser útiles en
sus programas.
8 ¿La memoria EEPROM de datos es una USERS
memoria volátil 0 no volátil?
236
10. INTERRUPCIONES
238 USERS
¿Qué son las interrupciones?
Bit 7 GIE (Global interrupt enable): éste es el bit que habilita todas las interrupciones:
Bit 6 EEIE tvrite complete interrupt enane): con este bit se habilita la
interrupción por finalización de escritura en la memoria EEPROM de datos:
Bit 5 TOIE (timer O interrupt enable bit): bit de habilitación de la interrupción por
desbordamiento del Timer O:
Bit 4 INTE (external INT enable bit): habilitación de la interrupción externa INT:
Bit 2 TOIF (timer O overflow interruptflag bit): bandera de desbordamiento del Timer
O:
239
10. INTERRUPCIONES
determinado. sin tener que esperar a que el proceso actual termine. Prácticamente todos los
microprocesadores y microcontroladores actuales tienen mecanismos de interrupción.
USERS
Bit I INTF (external interruptflag bit): bandera de interrupción externa INT:
INTF=O No se ha producido la interrupción INT
INTF=I Se ha producido la interrupción INT, debe borrase por software
Bit O RBIF (RB port change interruptflag bit): bandera de interrupción RBI:
Como podemos apreciar, el bit GIE habilita o deshabilita todas las interrupciones.
Cuando este bit está a 1, permite que ocurra cualquier interrupción. Cuando ocurre una
interrupción, este bit se pone automáticamente a O, para evitar que suceda otra
interrupción mientras se atiende la que ya se produjo. Al terminar de atender la
interrupción actual, mediante la instrucción de retorno retfie, este bit se pone
automáticamente a 1 nuevamente para habilitar otra vez todas las interrupciones.
Los bit que finalizan con IE (Interrupt Enane), como EEIE, TOIE, INTE, RBIE, sirven
para habilitar individualmente cada uno de los mecanismos de interrupción y los
usaremos para habilitar sólo las interrupciones que vayamos a utilizar. Los bits
terminados en IF (interrupt Flag), como TOIF, INTF, RBIF, son banderas que indican
cuándo se ha producido la interrupción en cada caso. Si bien falta la bandera de
interrupción por finalización de escritura en EEPROM, ésta se encuentra en el bit 4 del
registro EECONI, y es el llamado EEIF, como ya hemos estudiado.
240 USERS
Figura 2. Lógica de las interrupciones del PIC16F84A.
241
10. INTERRUPCIONES
Para retornar de una interrupción al punto donde se generó, se debe usar la instrucción retfie, la
cual automáticamente activa o pone a 1 el bit GIE del registro INTCON y habilita de nuevo todas las
interrupciones. También es posible regresar de una interrupción con las instrucciones return o
retlw, pero éstas no ponen a 1 el bit GIE
USERS
INTEDG INTEDG
PIC16F84A PIC16F84A
El flanco de la señal que producirá la interrupción se elige con el bit INTEDG del
registro 01)TION.
BIT 2
RBPU' INTEDG TOCS TOSE PSA PS2 PSI PSO rabia 2. EL bit
INTEDG del registro OPTION.
Bit 6 INTEDG (interrupt edge select bit): bit de selección de flanco en RBO/INT:
Así, cuando se produzca un flanco de subida o bajada (según el valor del bit INTEDG)
en el pin RBO/INT y si están habilitadas las interrupciones globales (GIE=I) y la
242 USERS
interrupción externa (INTE=I), se producirá una interrupción y se pondrá en marcha el
proceso que atenderá a dicha interrupción saltando a la dirección 0411.
243
10. INTERRUPCIONES
244
Interrupción externa INT
USERS
245
10. INTERRUPCIONES
mostrar la cuenta
USERS
addlw call
goto decenas
movf btfSC goto
muestra
decenas
movf
addlw call
unidades
movf addlw
call return
;Rutina de
atención a la
interrupción:
interrupcion
call btfsc goto
incf call
termina int
bcf retfie
#INCLUDE
#INCLUDE
END
246
Interrupción externa INT
USERS
247
10. INTERRUPCIONES
Recordemos que las banderas de interrupción no se borran solas, sino que debemos
eliminarlas por software. Finalmente, como podemos observar, con la instrucción
retfie, regresa de la interrupción y entra en modo de bajo consumo de nuevo hasta que
se produce nuevamente la interrupción.
Para guardar el contenido del registro W basta con definir un registro auxiliar para este
fin, por ejemplo, un registro llamado guardaW:
guardaw
Guardar el registro W, STATUS y otros registros de la memoria de datos al producirse una
interrupción se hace sólo cuando realmente es necesario, es decir, cuando el programa debe seguir
atendiendo otros procesos después de la interrupción, momento en el que se necesita no alterar
USERS
248
Interrupción externa INT
Pero, sin embargo, para el registro STATUS es algo más complicado. Veamos
qué sucede si lo intentamos guardar de la forma que muestra el siguiente
código:
movf STATUS, W
movwf guardaSTATUS
ES
incorrecto. . .
La instrucción movf puede alterar el valor de la bandera de cero (Z) y corromper, así,
el contenido del registro STATUS. Para resolver este inconveniente, Microchip
recomienda hacerlo de la siguiente forma:
swapf
movwf
Recuperar el valor de STATUS se hace también mediante una instrucción swapf, que
invierte nuevamente los nibbles en él y lo deja como estaba antes de la interrupción.
La rutina completa del proceso sería:
USERS
STATUS ;Restaura el contenido de STATUS
guardaW ,
guardaW , w ;Restaura el contenido de W
249
10. INTERRUPCIONES
INTERRUPCIÓN RBI
La interrupción RBI tiene que ver con un cambio de estado en los pines altos
(RB4 a RB7) del puerto B. Para ello hay que colocar el bit RBIE a 1 al igual que el
bit GIE. Esta interrupción se llevará a cabo en cualquier cambio en el estado de
las cuatro líneas más altas del Puerto B, es decir, cuando se pasa de 1 a 0 ó de 0
a 1. Veamos un ejemplo sencillo de estas interrupciones. Tomemos como base
el circuito de la Figura 6 a partir del cual diseñaremos un programa que lea los
pulsadores conectados a las líneas altas mediante interrupciones RBI. En el
display se mostrará el nombre de la línea del pulsador presionado.
USERS
250
Interrupción
RBI
251
10. INTERRUPCIONES
escribiendo en el LCD, y de esta forma podremos usar el LCD y los pulsadores al
mismo tiempo.
USERS
El código fuente será el siguiente:
252
Interrupción
PROCESSOR PIC16F84A
#INCLUDE
CBLOCK OXOC
ENDC
ORG 0011
call LCD inicializa goto inicio
inicio bsf STATUS, RPO ;Acceso al banco I bcf OPTION REG, NOT RBPU
;Activa Pull-ups internos movlw movwf TRISB ;Líneas altas
como entrada bsf INTCON, RBIE ;Habi1ita interrupción RBI bsf INTCON,
GIE ;HabiIita interrupciones globales bcf STATUS, RPO ;Acceso al banco O
loop sleep ;Espera hasta la interrupción goto loop
253
10. INTERRUPCIONES
USERS
RBI
254
Interrupción
goto
LCD RB4
movlw call
espera4
btfss goto
goto
LCD RB5
movlw call
espera5
btfss goto
goto
LCD RB6
movlw call
espera6
btfss goto
goto
LCD RB7
movlw call
espera7 btfss
goto fin int
call bcf
El proceso de atención a una interrupción es muy parecido al de las subrutinas: cuando se genera
una interrupción es como si se llamara a la subrutina que comienza en la dirección 04h, el vector de
interrupción. Para finalizar la atención de esta interrupción se debe regresar al punto donde fue
"llamada" mediante la instrucción retfie.
USERS
255
10. INTERRUPCIONES
;Regresa de la interrupción
;Mensajes a mostrar
PCL, F
"Pulsado: , OOh
"Pulsado: , OOh
"Pulsado: , OOh
"Pulsado: , OOh
<LCD4BITS. INC>
<LCDMENSAJES. INC>
Así podemos apreciar el funcionamiento de las interrupciones RBI, que nos resulta
de mucha utilidad cuando se requiera lectura de pulsadores o teclados. Es
importante notar cómo con las interrupciones nos olvidamos por completo de la
técnica de muestreo para leer los pulsadores, ya que la lectura de éstos se genera
de forma inmediata al producirse una interrupción. Esto tiene muchas ventajas
porque no debemos detener el programa para muestrear las líneas de los
pulsadores y el programa puede atender otros procesos. Podemos descargar el
código fuente y el código máquina de este ejemplo (RBI.asm y RBI.hex) del sitio
www.redusers.com para su estudio y comprobación.
256 USERS
Teclados
Los teclados son dispositivos de entrada muy útiles en los sistemas actuales. Basta con observar
cuántos aparatos electrónicos modernos cuentan con uno de ellos, por ejemplo, las
257
10. INTERRUPCIONES
computadoras, los teléfonos. los celulares. un equipo de sonido. prácticamente todos los
aparatos digitales cuentan con alguna especie de teclado para controlar sus funciones.
USERS
258 USERS
Teclados
Así se puede leer la coordenada del pulsador que fue presionado mediante la
lectura de las filas y las columnas que conforman la matriz para obtener su valor.
Veamos cómo funciona la rutina para determinar cuál del los pulsadores se ha
presionado.
259
10. INTERRUPCIONES
USERS
260 USERS
Teclados
261
10. INTERRUPCIONES
262 USERS
Teclados
CBLOCK
tecla
ENDC
263
10. INTERRUPCIONES
samblar:
e la memoria de
oB
OT RBPU ;Activa
RB3 salidas, RB4
movf PORTB, W ;
presionada?
bsf STATUS, C
movwf PORTB btfss
ectura
USERS
264
Teclados
USERS
265
10. INTERRUPCIONES
Con esta librería podemos leer un teclado, ya sea con la técnica de muestreo, o
mediante interrupciones RBI. Veamos un ejemplo de ello para lo que tomaremos
el circuito de la Figura 15. A partir de ahora colocaremos los teclados con un
símbolo.
266
Teclados
USERS
267
10. INTERRUPCIONES
PROCESSOR 16F84A
#INCLUDE
CBLOCK OXOC
ENDC
ORG OOh
inicio
END
Como podemos apreciar, el código es bastante sencillo al usar nuestra librería. En este
ejemplo tenemos un bucle que lee constantemente el teclado y refleja el número de la
tecla pulsada en los 4 primeros bits del Puerto A. Pero para hacer más eficientes
nuestros programas podemos hacer uso de la interrupción RBI para leer el teclado sólo
cuando se presione alguna de sus teclas. Veamos cómo se hace:
268
Teclados
OOh inicio
0411 lee
teclado
tecla, W
PORTA
teclado_pulsado
INTCON, RBIF
teclado inicializa
STATUS, RPO
b' 10001000'
INTCON
TRISA
STATUS, RPO
PORTB
PORTA
principal
<TECLADO. INC> ;Activa GIE y RBIE
Los resistores de 470 ohms conectados con el teclado tienen una doble función. Por una parte
evitan que se genere un cortocircuito entre dos líneas de salida, si se presiona más de una tecla. y
por otro para permitir la conexión del LCD en el mismo puerto, también para evitar un cortocircuito
cuando se presiona una tecla y se está escribiendo al mismo tiempo en el LCD
USER 269
10. INTERRUPCIONES
USERS
Las ventajas de usar interrupciones son evidentes: sólo se accede a la lectura del
teclado cuando se requiere. Mientras no se presione ninguna tecla, se puede atender
a otros procesos, o entrar en modo de bajo consumo y así ahorrar energía.
Figura 16. Circuito para compartir un teclado y display LCD en el Puerto B del
PIC16F84A.
270
Teclados
CERRADURA ELECTRÓNICA
La aplicación por excelencia que se desarrolla para observar el funcionamiento
del teclado y el display LCD juntos es una cerradura electrónica. Para eso,
primero necesitamos definir el circuito, que incluye el teclado y el LCD. Además
de ello usaremos el pin RA3 como salida de control para el mecanismo de
apertura de una puerta u otro elemento que necesitemos proteger con nuestra
cerradura electrónica con PIC16F84A.
USER 271
10. INTERRUPCIONES
USERS
272
Cerradura electrónica
El circuito deberá funcionar de la siguiente manera: al encenderlo, la pantalla del
display estará vacía y el microcontrolador entrará en modo de bajo consumo. Al
presionar por primera vez una de las teclas, comenzará a recibir la clave, que en
nuestro caso será de 4 dígitos. En este caso usaremos un teclado decimal o de 12
teclas, tal como vemos en la Figura 17, ya que la clave a ingresar constará de 4 dígitos
decimales. Una vez que se han presionado 4 teclas, el programa deberá comparar la
clave introducida con la clave almacenada para ver si es igual. En caso de serlo, se
activará (se pondrá a 1) el pin RA3 por 5 segundos, permitiendo la apertura de la
puerta que protege y colocando el mensaje Clave correcta en el display. En caso de
no ser la clave correcta, aparecerá en el display la indicación Clave incorrecta durante
tres segundos y, por supuesto, el pin RA3 no se activará. En cualquiera de los dos
casos, después de transcurridos los tres o cinco segundos respectivamente, el
sistema estará listo para recibir nuevamente una clave en el teclado.
El circuito de control será aquél que abra la puerta mediante una cerradura eléctrica,
que generalmente es un electroimán que deberá activarse de forma adecuada.
Puede conectarse a la salida del P 1C, como se muestra en la Figura 18, aunque por
supuesto el circuito dependerá de lo que tengamos exactamente, o de la aplicación
que vayamos a asignarle. En cualquier caso, nuestro código para la cerradura
electrónica puede ser el que detallamos a continuación:
USER 273
10. INTERRUPCIONES
La librería para el teclado 4x4 también es capaz de manejar teclados con menos columnas. Por
ejemplo, se puede manejar perfectamente un teclado 4x3. Esto es por que la columna que falta no
274
Cerradura electrónica
generará ningún efecto. tal como si estuviera, pero nunca fueran presionadas sus teclas. El pin de
entrada de la columna faltante deberá dejarse libre.
275
10. INTERRUPCIONES
USERS
b' 10001000'
PORTA, 3
INTCON
;
movlw
bcf
duerme
movwf
duerme
0x20
sleep
goto FSR
cerradura
lee teclado
movlw
movwf lee tecla, W
Inicializa la dirección
clave d' 14' donde
tecleada STATUS, ; se almacenará la clave tecleada
call Z ;Rutina para leer la clave
cancelar
; Lee la tecla pulsada
movf
sublw tecla, W
btfsc
STATUS, C tecla la 14 (asterisco)?
goto no valida ; Si, cancela t0d0
movf
tecla,
sublw
btfss goto INDF mayor a 9?
FSR, F ;Si, ningún efecto
movf léelo
movwf incf movlw ;Si es dígito decimal
LCD caracter
call movf sublw FSR, W ; Almacénalo
btfsc goto tecla no 11'24' ; Incrementa puntero FSR
valida call espera STATUS, Z
no_pulsado call fin clave ; Envía al display
teclado_pulsado
; ¿se han leído 4 dígitos?
;Si, termina la lectura
debounce
;Si el teclado esta pulsado
276
Cerradura electrónica
USERS
o otra tecla?
ue se pulse
o pulsado
eída
ntero para
acenada
er la clave de
a tabla
cleado y restalos
eada es
arando
acceder al
ero para leer
rado 4 dígitos?
parando
orrecta ;Activa
en el display
os
en el display
os
277
10. INTERRUPCIONES
USERS
teclado_pulsado
call INTCON, RBIF
espera bcf
retfie
retardo 5s
d'163'
cont ret
movlw ret_loop
movwf goto
retardo 3s d'98'
cont ret
movlw
debounce
movwf cont ret,
ret_loop
ret_loop call
decfsz goto
return agregan librerías necesarias:
las
<TECLADO. INC>
#INCLUDE <LCD4BITS. INC>
#INCLUDE <LCDMENSAJES. INC>
#INCLUDE
END
La cerradura electrónica de este capítulo puede tener multitud de aplicaciones: puede ser una
cerradura clásica que permite abrir la puerta de una habitación o la puerta de una caja fuerte. Con
algunas modificaciones del programa. podemos usarla para permitir el encendido de algún aparato
electrónico o eléctrico. Sólo es cuestión de usar nuestra imaginación.
278
Cerradura electrónica
USERS
279
10. INTERRUPCIONES
La clave secreta está grabada en la memoria de programa, en la tabla llamada
clave_secreta, por lo que es fija y no puede modificarse a menos que se grabe de
nuevo el programa en el PIC. La rutina de comparación de la clave tecleada compara
los dígitos introducidos por el teclado con la clave de esta tabla.
Figura 19. Detalle del funcionamiento del programa para la cerradura electrónica.
280 USERS
la clave tecleada se almacenará a partir de la dirección de la memoria de datos. Esto es para
evitar sobrescribir los registros utilizados en el programa o en las librerías.
Al contar con un teclado decimal conformado por los dígitos del O al 9 y los símbolos
* y #, tal como se muestra en el diagrama del circuito, debemos colocar un teclado de
4x3. En caso de tener uno de 4x4 (como el de la Figura 14), podemos también usarlo,
ya que las teclas correspondientes a letras y el símbolo # son ignoradas en el programa
y no generarán ningún efecto si son presionadas. La tecla de asterisco se usa para
cancelar la introducción de dígitos en cualquier momento entre la pulsación del primer
al tercer dígito, por lo tanto, se puede llamar a esta tecla Cancelar.
Con lo visto aquí tenemos un claro ejemplo del uso de un teclado en nuestros
proyectos. Por supuesto podemos introducir todas las mejoras que consideremos para
la aplicación exacta que tengamos en mente. En el sitio www.redusers.com podemos
descargar los archivos Cerradura.asm y Cerradura.hex para su comprobación en el
circuito.
INTERRUPCIÓN POR
DESBORDAMIENTO DEL TIMER O
Ya estudiamos antes el uso del Timer O del PIC16F84A, ahora veremos cómo se
puede tener una interrupción cada vez que el Timer O se desborda, es decir, cuando
alcanza su máximo valor que es 1 1 1 1 1 1 1 1, se incrementa una vez más pasando a
00000000 y provoca que se active el bit TOIF. Además, veremos que si los bits GIE y
TOIE están a l, se generará una interrupción, llamada TOL
281
10. INTERRUPCIONES
Latencia de interrupción
La interrupción por desbordamiento del Timer O nos puede resultar de mucha utilidad
en la medición y control de tiempos. Como vimos en el Capítulo 8, podemos calcular
tiempos de desbordamiento del timer O con la fórmula:
USERS
Tiempo = prescaler (256 - carga) + 2
Hemos estudiado cómo obtener temporizaciones exactas con el Timer O. Esta vez
haremos lo mismo, pero empleando la interrupción lo cual, como nos hemos dado
cuenta, tiene muchas ventajas. Un ejemplo es el siguiente programa que genera una
onda cuadrada de 4 KHz en el pin RA3 del PIC16F84A. Esta vez se realizará mediante
la interrupción TOL Necesitaremos en esta ocasión un período de 250 microsegundos
y, por lo tanto, un tiempo en alto de 125 y en bajo también, 125 microsegundos. Al
calcular con nuestra nueva ecuación obtendremos:
282 USERS
carga = 256 - 125 - 5 - 136
1
Interrupción por desbordamiento del Timer O
283
10. INTERRUPCIONES
PROCESSOR 16F84A
#INCLUDE
inicio bsf STATUS, RPO clrf TRISA movlw b' 00001000' movwf OPTION REG ; Sin
prescaler, TMRO como temporizador bsf INTCON, GIE ;Activa interrupciones
globales bsf INTCON , TOIE ;Activa la interrupción TOI bcf STATUS, RPO bcf
PORTA, 3 movlw d'154' movwf TMRO
USERS
284 USERS
PORTA, 3
INTCON, TOIF
PORTA, 3
INTCON, TOIF
Tiempos largos
En ocasiones necesitaremos temporizar o medir tiempos más largos. Como sabemos,
el límite del timer O, si usamos un oscilador de 4 MHz y el prescaler más alto, sería:
Por lo que si necesitamos contar tiempos más largos debemos usar un registro auxiliar
que nos permita contar las veces que se ha generado la interrupción y así lograr
nuestro objetivo. A continuación veremos un ejemplo.
285
10. INTERRUPCIONES
50000 -
carga = 256 - Tiempo - 5 = 256 - 5 = 60.7
prescaler 256
Pero claro, debemos cargar el Timer O con un valor entero, así que tomaremos el valor
más cercano hacia arriba, que es 61. Con esto recalculamos el tiempo:
Figura 20. Detalle del funcionamiento del programa para el reloj básico.
USERS
De esta forma escribimos nuestro código fuente que quedará similar a esto:
286
Reloj digital básico
CONFIG cp OFF & WDT OFF & PWRTE ON & OSC
PROCESSOR 16F84A
#INCLUDE
call LCD inicializa movlw d' 20' movwf auxiliar ;lnicializa el contador auxiliar
movlw b' 10000110' call LCD comando movlw call LCD caracter ;C010ca los dos puntos
para separar movlw b ' 10001001 ' call LCD comando movlw
287
10. INTERRUPCIONES
USERS
288
Reloj digital básico
USERS
segundos,
289
10. INTERRUPCIONES
290
Reloj digital básico
USERS
segundos, W
BINaBCD
envia_digitos
LCDminutos minutos, W
movlw call BINaBCD
correcta movf envia_digitos
call call return
envia_digitos
PRIORIDAD DE INTERRUPCIONES
Si estamos utilizando dos 0 más mecanismos de interrupción en un programa, debemos verificar las
banderas de interrupción para determinar cuál de ellas se produjo. La bandera de interrupción que
se verifica primero es la que tendrá mayor prioridad. ya que es la que se atenderá más rápidamente
al producirse, y la última tendrá la menor prioridad.
291
10. INTERRUPCIONES
USERS
USERS
293
Interrupción por finalización de escritura en EEPROM
estudiado hasta aquí no debemos tener mayores problemas para hacerlo, por
lo que queda como un buen ejercicio de programación para completar el reloj
para que sea 100% funcional.
294
En este capítulo hemos estudiado los cuatro mecanismos de interrupción con los que
cuenta el PIC16F84A. Son sumamente útiles en muchos proyectos. Por eso, hemos visto
algunas aplicaciones, tal como las temporizaciones exactas, usando la interrupción del
Timer O, o el uso de teclados, que es una aplicación típica de las interrupciones RBI. El
uso de interrupciones nos permite el diseño de poderosas y eficientes aplicaciones de
forma fácil.
USERS
PRÁCTICAS
ón tie-
I Escriba el programa de la sección
Interrupción externa INT en MPLAB,
ensám-
blelo y grábelo en el microcontrolador
pa-
ra comprobar su funcionamiento.
Modifique el programa de la
nterrup- 2 cerradura
electrónica de tal forma que ahora la
clave se guarde en la memoria EEPROM
de
cuando datos. De esa manera, se permitirá
cam-
biar la clave al usuario. Al presionar la
tecla # se pedirá la clave actual y, si es
co-
stro INT- rrecta, se pedirá la clave nueva, la
cual una
vez tecleada se guardará en la EEPROM
sustituyendo a la anterior.
n INT
3 Agregue el modo de 12 horas al reloj
digital. de tal forma que mediante un
pulsador
e las ban- conectado en algún pin libre del
Puerto A se
cambie entre los dos modos al
presionarlo.
USERS
Comunicación
en bus 12C
En este capítulo hablaremos del uso
de un protocolo de comunicación serial
llamado 12C, que pude ser de gran
El bus 12C 326
296
Expansor de puertos 12C
PCF8574 338
DS1621 termómetro
Diseño de un termómetro
Resumen 357
EL BUS 12C
La comunicación en serie entre diferentes dispositivos electrónicos es muy utilizada en
la actualidad por sus ventajas sobre los métodos paralelos. Philips es el desarrollador
de un protocolo de comunicación serial llamado 12C 0 11C (Inter 1C), el cual permite
la comunicación serial entre dispositivos con el uso de tan sólo dos líneas de
comunicación. Hoy en día, existen muchos circuitos integrados que funcionan bajo el
protocolo 12C, y que pueden resultarnos sumamente útiles para algunas aplicaciones
con microcontroladores P 1C. Es por eso que en esta sección estudiaremos el
funcionamiento y la aplicación del bus 12C con el microcontrolador PIC16F84A.
Existen dos líneas que forman el bus: una, llamada SDA (Serial DAta line), y otra,
SCL (Serial CLock line). La línea SDA es por la que se transmitirán los datos y la
El bus del que estamos hablando es llamado 12C, que significa Inter integrated circuit. 0 en español
podríamos traducirlo como inter circuito integrado. Esto es debido al propósito de este bus de
298
El bus 12C
servir de comunicación entre dos o más circuitos integrados. Aunque el superíndice indica la doble I
(l al cuadrado) es también común sólo escribirlo como 12C.
USERS
línea SCL es la encargada de sincronizar las transferencias y es la señal de reloj. Las
líneas de comunicación SDA y SCL son del tipo drenador abierto, esto significa que los
dispositivos 12C conectados al bus tienen una configuración interna de colector o
drenador abierto, por lo cual sólo pueden llevar las salidas a nivel bajo, pero no a
nivel alto, y es por eso que se usan los resistores de pull-up (Rp) para mantener las
líneas a nivel lógico alto.
De esta forma, cuando el bus esté inactivo estará siempre en un nivel alto, ya que los
dispositivos se encontrarán en modo de alta impedancia y los resistores de pull-up
obligarán al bus a permanecer en nivel alto. El número de dispositivos conectados al
bus en principio no tiene límite, pero realmente éste estará dado por la capacitancia
del bus al conectar dispositivos en él, que no debe superar los 400 pf. El valor de los
resistores de pull-up no es muy crítico, puede usarse desde I kohm a 20 kohms. A un
valor más bajo de los resistores disminuye la sensibilidad al ruido y mejora los
tiempos de los flancos de bajada y subida, pero también aumentará el consumo del
bus. Los valores recomendados están entre I . 5 kohms y IO kohms.
identificará con ella. El bus puede tener más de un maestro en lo que se llama
configuración multi-maestro, pero esto no es muy común.
El protocolo 12C
Veamos cómo se transmite la información a través del bus 12C. En nuestro caso
utilizaremos el microcontrolador como dispositivo maestro y, emulando el protocolo,
se comunicará con dispositivos 12C para enviar o recibir datos de ellos. Por supuesto,
la transmisión debe seguir un orden o protocolo para llevarse a cabo correctamente.
SCL
START
Una vez que finaliza la transferencia de datos, el maestro enviará una condición de
STOP al bus. La condición de STOP o fin es contraria a la de START. Primero, el
maestro libera la línea SCL para que quede a nivel alto, y luego la línea SDA,
300 USERS
El bus 12C
Las ventajas de usar el protocolo del bus 12C son evidentes. Por ejemplo, se tienen sólo dos líneas
de comunicación, lo cual representa una gran ventaja frente a los buses paralelos que requieren
muchas líneas o cables. Además, esto hace que los sistemas que lo utilizan sean más eficientes,
pequeños. baratos, y más inmunes a las interferencias electromagnéticas.
SDA
SCL
STOP
Y de esta forma se inicia y se finaliza una transmisión de datos a través del bus.
Después de la condición de inicio o START se enviarán o recibirán uno a uno los
bits de datos en serie, según sea el caso.
Envío de datos
Una vez establecida la condición de inicio o START por parte del maestro, se iniciará
la comunicación por bytes o grupos de 8 bits. Para la transmisión de datos, la línea
SDA no puede cambiar de estado mientras SCL esté en alto, ya que esto sería
interpretado como una condición de START o de STOP, por lo que, para transmitir un
bit la línea SDA, sólo debe cambiar mientras la línea SCL esté en estado bajo.
Cambio Dato válido
de datos
SDA
SCL
Para la transmisión de un byte en el bus se debe enviar primero el bit de más peso o
MSB y terminar con el de menos peso o ISB. El primer byte de la comunicación
USER 301
11. COMUNICACIÓN EN BUS 12C
siempre es del maestro hacia el bus y debe contener la dirección del esclavo al cual se
quiere acceder en los 7 bits altos, y el bit más bajo es destinado a indicar si se realizará
lectura o escritura en el esclavo definido por la dirección anterior. Este bit es llamado
RN. Se transmite un bit en cada pulso de reloj de SCL.
302 USERS
El bus 12C
Figura 6. Formato para la transmisión del primer byte a través del bus 12C.
Una vez que se ha transmitido este byte con la dirección y el bit R/W, el dispositivo
esclavo que tiene la dirección correcta enviará un bit de reconocimiento o
acknowledgement (se puede abreviar ACK) en el noveno pulso de reloj, indicando al
maestro que está listo para el envío o recepción de datos. El bit de reconocimiento es
obligatorio para completar cada transmisión de un byte, excepto en el último byte
leído de un esclavo, y quien enviará este bit será quien reciba los datos, ya sea algún
esclavo o el propio maestro. En ambos casos, el maestro es quien generará el pulso
de reloj para el bit ACK. También se puede enviar un bit de reconocimiento negado
(NOT ACK o NACK) es decir, que equivale a un estado alto en el bit de
reconocimiento.
NACK
SDA
SCL
Si uno de los esclavos no puede recibir o transmitir datos debido a que se encuentra
ocupado en procesos internos, entonces puede mantener la línea SCL en bajo,
obligando al maestro a entrar en modo de espera hasta que el esclavo libera la línea y
la transmisión puede llevarse a cabo.
USER 303
11. COMUNICACIÓN EN BUS 12C
responde con el bit ACK y entonces se le envía uno o más bytes consecutivamente. Al
finalizar, el maestro enviará la condición STOP para terminar la transmisión.
En el bus 12C se usan los resistores de pull-up para mantener el estado del bus en alto, ya que los
dispositivos conectados tienen configuración de colector o drenador abierto, y sólo pueden enviar
ceros y no unos. Las primeras veces que se usa el bus 12C es muy común que nos olvidemos de
colocar los resistores, y por lo tanto el bus no funciona.
En la transferencia del esclavo hacia el maestro, éste no debe enviar el bit JACK en el
último byte, sino que en él se debe enviar un bit NACK, para que el esclavo deje libre
el bus y el maestro pueda enviar la condición de STOP. Si se envía el bit ACK en el
último byte, el esclavo puede no liberar el bus ya que asumirá que el envío no ha
304 USERS
El bus 12C
Transferencia mixta
También puede haber un cambio en la dirección de transferencia. Si el maestro
necesita seguir comunicándose con el mismo esclavo o con otro, en lugar de generar la
condición STOP puede enviar una nueva condición de START, llamada START
repetido o Sr, y con ello iniciará una nueva transferencia de datos, en la que el bit R/W
puede cambiar la dirección de transferencia.
S Dirección esclavo R/W A Datos A/Ã Sr Dirección esclavo R/W A Datos A/Ã P
Temporizaciones
El bus 12C tiene tres velocidades de trabajo:
• Modo estándar: es el modo más utilizado, con una velocidad aproximada de 100
kb/s. Es la velocidad que usaremos nosotros para trabajar con el PIC16F84A y los
dispositivos 12C.
En la transmisión de un esclavo hacia el maestro se debe enviar un NACK 0 ACK negado en el último
byte. Esto es para que el esclavo deje libre el bus. Debemos observar que técnicamente no es lo
mismo enviar un NACK que no enviar ACK, esto último puede suceder cuando un esclavo no recibe
bien los datos del maestro por algún problema y no envía el bit ACK.
USER 305
11. COMUNICACIÓN EN BUS 12C
• Modo rápido: en este modo la velocidad de transferencia está en unos 400 kb/s.
• Modo de alta velocidad: es el modo más rápido que puede alcanzar un bus 12C.
Está en el rango de aproximadamente 3.4 Mb/s.
Figura Tiempos definidos para el modo estándar en las señalesdel bus 12C.
Debemos tener en cuenta estos tiempos mínimos para que las transmisiones sean
exitosas en el bus. En la Tabla 1 encontraremos la explicación de cada uno de los
tiempos marcados en la Figura 11.
Condición de espera para la condición START o START tHD;STA 4 Microsegundos repetido. Tiempo
entre el flanco de bajada en SCL y el flanco de bajada en SDA.
4.7
tHlGH 4
Microsegundos
lempo de inicio de la condición de START repetido. tSU;STA
Tiempo en que debe estar libre el bus antes de la ondición de inicio repetido.
Tiempo de inicio de la condición STOP. Tiempo entre el tSU;STO 4 Microsegundos flanco de subida en SDA y
el flanco de subida en SCL.
lempo que debe estar el bus libre entre una tBUF 4.7 Microsegundos ndición de STOP START
306
El bus 12C
Tabla I. Tiempos mínimos de las señales del modo estándar del bus 12C.
USERS
La conexión de los dispositivos 12C al PICI 6F84A la realizaremos en las líneas RA3 y
RA4, siendo la línea RA3 el reloj SCL, y RA4 el bus de datos SDA.
Librería 12C
Ahora que ya conocemos el protocolo, la conexión y la temporización de la
comunicación del bus 12C, podemos escribir una librería para las comunicaciones 12C
con el PICI 6F84A. A continuación, incluimos la librería 12C.INC que podemos
El bus 12C se plantea inicialmente para ser utilizado en equipos electrónicos de consumo
masivo, como televisores, sistemas de video, audio, etcétera. Es por ello que podemos
307
11. COMUNICACIÓN EN BUS 12C
encontrar muchos circuitos integrados 12C que realizan funciones propias de estos
aparatos, como procesadores de video, ecualizadores, controles de volumen,
amplificadores, etcétera.
308
El bus 12C
USERS
309
11. COMUNICACIÓN EN BUS 12C
bancol bsf SCL ; Libera la línea SCL para ponerla en alto bancoo
ENDM
SCL_bajo MACRO bancol bCf SCL ;SCL como salida bancoO bcf
SCL ;SCL a nivel bajo
ENDM
SDA_bajo MACRO bancol bcf SDA ;SDA como salida bancoO bcf SDA
;SDA a nivel bajo
ENDM
USERS
310
11. COMUNICACIÓN EN BUS 12C
2C: 12C
to $+1 ;
eturn
r movlw movwf
SDA ;SDA como
o,
311
11. COMUNICACIÓN EN BUS 12C
USERS
312
El bus 12C
12C NACK
SCL alto ;lnicio del pulso de reloj para ACK goto $+l ;Espera (tiempo tHIGH)
SCL_bajo ;Fin del pulso de reloj para ACK movf 12C_byte, w;Pasa el
byte leído a W return
;Subrutina para verificar si el bus esta libre leyendo si SDA esta en alto: bus
libre bancol bsf SDA ;SDA como entrada bancoO btfss SDA
Podemos observar cómo, con el PICI 6F84A, se emula el protocolo 12C para poder
comunicarnos con dispositivos integrados, para poder diseñar circuitos muy
versátiles.
USERS 313
11. COMUNICACIÓN EN BUS 12C
Es importante notar cómo, la mayoría de los tiempos requeridos, los dan las propias
instrucciones, por lo tanto, no es necesario usar retardos, excepto en algunos casos,
para ajustar y cumplir con los tiempos mínimos que marca el protocolo para el
modo estándar. Hemos utilizado algunas macros para facilitar la escritura y la
lectura de la librería, no hemos empleado subrutinas para evitar los tiempos de los
saltos de la instrucción call y return, lo cual le quitaría un poco de velocidad a la
transmisión. Con esta librería se puede transmitir muy cerca de la velocidad
máxima del modo estándar del bus 12C.
Es muy importante tener en cuenta ciertos detalles del uso de esta librería: por
un lado, la subrutina 12C START permite enviar las condiciones de START y
de START repetido (Sr). Y para la lectura de bytes desde alguno de los
esclavos se debe usar el registro ACKflag para indicar si el byte que está por
leerse es el último o no. Recordemos que en el último byte leído desde alguno
de los esclavos se debe enviar el bit de reconocimiento negado (NACK), por
lo que el bit 0 del registro ACKflag se usa para indicar con un O en él si no es
el último byte a leer, y con un I si es el último byte, para que la librería genere
el bit NACK en el último byte a leer de alguno de los esclavos del bus.
USERS
314
Expansor de puertos 12C PCF8574
Vdd
SDA
o 16
SCL
2 15
INT
3 14
4 13
5 12
6 11
7 10
8 9
PCF8574
Figura 13. El PCF8574 contiene un puerto de
entrada/salida de 8 líneas (PO a P7).
USERS 315
11. COMUNICACIÓN EN BUS 12C
fabricante. En el caso del PCF8574, tiene asignados los bits 0100, mientras que para el
PCF8574A la parte fija es 0111.
Parte fija Parte programable
Dirección
Bit de
lectura/escritura
Parte fija
Parte
programable
o 1 1
PCF8574A
Dirección Bit de lectura/escritura
Figura 14. Especificación de dirección como esclavo para el PCF8574 y el PCF8574A.
El PCF8574 dispone de un puerto de 8 líneas que pueden ser usadas tanto como
entrada o como salida de datos, y no necesitan configurarse. Cuando se usan como
puerto de salida, simplemente hay que enviar el dato al PCF8574 a través del bus
12C, y éste lo colocará automáticamente en el puerto. Para usar el puerto como
entrada simplemente hay que leer el puerto a través del bus 12C.
Pulso de
escritura
Datos del
registro de
Interrupción
316
Expansor de puertos 12C PCF8574
desplazamient
o
Power-on
reset
Pulso de
lectura
Datos hacia
el registro de
desplazamient
o
Figura 15. Configuración interna de cada uno de los pines del puerto del PCF8574. USERS
USERS 317
11. COMUNICACIÓN EN BUS 12C
Veamos un ejemplo del uso del PCF8574 como puerto de salida. Simplemente
haremos un contador binario que se mostrará a la salida del puerto:
318
Expansor de puertos 12C PCF8574
;Condición de START
;Dirección PCF8574 + bit escritur
salida
d' 244'
contadorl
contador2
Si tenemos varios PCF8574 conectados a nuestro microcontrolador y necesitamos usarlos como
entradas de datos, al menos a más de uno, entonces deberemos usar la salida de interrupción en
ellos. Dado que la salida de interrupción del PCF8574 es de drenador abierto, podemos unirlas
formando una AND cableada para conectarlas al PIC.
USERS
USERS 319
Expansor de puertos 12C PCF8574
Si decfsz contador2, F
loop2
goto contador 1 ,
decfsz loopl
goto
return
<12C. INC>
#INCLUDE
END
Salida de interrupción
El PCF8574 dispone de una salida de interrupción que nos puede ser útil para generar
una interrupción en el microcontrolador cuando los datos en el puerto cambien. La
salida de interrupción es de drenador abierto, por lo tanto, debemos usar resistores de
pull-up en ella. Cuando se genera un cambio de estado en las líneas de entrada, esta
línea de interrupción envía un flanco de bajada para disparar la interrupción en el PIC.
De esta forma, el PIC sabrá que hay nuevos datos sin tener que leer el PCF8574 a
través del bus 12C. La salida de interrupción regresará al estado alto cuando el puerto
regrese al estado anterior al cambio, o bien cuando se realice una lectura o escritura en
el PCF8574 a través del bus 12C.
USER 320
Expansor de puertos 12C PCF8574
Figura 17. Circuito de ejemplo para el uso de las líneas del PCF8574 como entradas.
321
11. COMUNICACIÓN EN BUS 12C
inicializa call
STATUS, RPO
TRISB, O
call
principio
OPTION REG
bsf bsf
movlw movwf STATUS, RPO b'
flanco de bajada 10010000'
bcf movlw movwf INTCON
inicio sleep
goto
inicio
interrupcion call
movlw
call bsf
12C START
call call
b'01000001 '
12C_enviaBYte
call call
ACKf1ag, O
movf
addlw call 12C_1eeByte
12C STOP
BINaBCD
borra_display
BCDcentenas, W
LCD caracter
322 USERS
Expansor de puertos 12C PCF8574
USERS
BCDdecenas, W
LCD caracter
BCDunidades, W
LCD caracter
INTCON, INTF
<12C. INC>
<LCD4BITS. INC>
<BINABCD. INC>
Como podemos apreciar es bastante fácil el uso del PCF8574 como puerto de entrada.
La interrupción le notifica al PIC16F84A cuando ha cambiado la entrada, y de esa
forma se lee el nuevo dato cada vez que así ocurre. No es necesario inicralizar el
puerto enviando unos, ya que, como mencionamos antes, al encender el circuito
automáticamente se configura así. Al leer el estado del puerto del PCF8574 se borra la
salida de interrupción, por lo que el circuito siempre estará atento ante cualquier
cambio en las líneas de entrada. No utilizamos pull-ups externos ni en el puerto del
PCF8574, ya que los tiene internos, ni en la salida de interrupción, ya que activamos
los pull-ups internos del puerto B del PICI 6F84A. La principal ventaja del PCF8574
es proporcionar un puerto de 8 bits extra, de modo que podemos aprovechar esta
característica para conectar nuestro LCD, un teclado, un display de 7 segmentos, o
cualquier otro circuito de entrada o salida. De esta forma tenemos la posibildad de
construir un sistema muy complejo al aumentar la capacidad de líneas de
entrada/salida del microcontrolador.
DS1621 TERMÓMETRO
Y TERMOSTATO EN BUS 12C
Como otro ejemplo del bus 12C, tomaremos el circuito integrado DS1621, que es un
sensor de temperatura y termostato. Sus características son:
El DSI 621 tiene integrado el sensor de temperatura y debido a esto no necesita ningún
componente externo para funcionar. Al conectarlo a nuestro microcontrolador con un
bus 12C, podemos obtener la lectura de la temperatura a la que se encuentra, además
de tener un termostato configurable.
324 USERS
DS1621 termómetro y termostato en bus 12C
USERS 325
11. COMUNICACIÓN EN BUS 12C
El registro de configuración
El DS1621 contiene un registro de configuración en donde podemos obtener
información de la operación del circuito y configurar los parámetros de
funcionamiento.
BIT 7 BIT 6 BIT 5 BIT 4 BIT 3 BIT 2 BIT 1 BIT O
THF SHOT
WB POL
rabia 3. El registro de configuración del DS1621 (ACh).
326 USERS
DS1621 termómetro y termostato en bus 12C
el fabricante (en este caso son 1001). Los tres últimos bits se definen mediante las
entradas AO, Al y A2 en los pines del circuito integrado.
Parte fija Parte programable
O o 1 Al AO ftR/W
1
Dirección DS1621
Bit de lectura/escritura
USERS 327
11. COMUNICACIÓN EN BUS 12C
Diseño de un termómetro con DS1621
Construiremos un termómetro digital con el circuito DS1621. En la Figura 21 tenemos
el diagrama con la conexión del DS1621 al PIC16F84A y en la salida Tout tenemos un
led de color rojo que indica que se ha sobrepasado la temperatura del termostato.
328 USERS
DS1621 termómetro y termostato en bus 12C
USERS 329
11. COMUNICACIÓN EN BUS 12C
Inicializa DS1621
START
Byte a escribir en
Envía byte registro de
(00000011) configuración
STOP
Fin inicialización
Si vamos a usar al DSI 621 como termostato, debemos escribir los valores deseados
en los registros TH y TL, para que queden configurados los límites de temperatura.
Aunque el PICI 6F84A puede ser sumamente útil en multitud de aplicaciones, por supuesto que no
es el único microcontrolador de la familia de los PIC. Existe una gran variedad con diferentes
características y funciones. Algunos PIC de gama baja y media muy populares en la actualidad son:
PIC12F629, PIC12F675, PIC16F628A, PIC16F88, PIC16F887.
330 USERS
DS1621 termómetro y termostato en bus 12C
Estos registros son no volátiles, por lo que sólo necesitamos escribirlos una sola vez y
su valor se retendrá, aun si quitamos la alimentación del circuito. En el programa que
diseñaremos habrá una rutina para leer el valor de los registros TH y TL, y
compararlos con los valores que necesitamos. Si los valores son correctos no se
escribe en ellos, de esta forma sólo se escribirán una vez.
Una vez escritos los registros TH, TL y la configuración, estamos listos para comenzar
a leer la temperatura. Como configuramos en modo one shot, debemos iniciar la
conversión cada vez que necesitemos obtener una nueva lectura. En este punto es
donde inicia la lectura de temperatura para luego mostrarla en el display.
USER 331
11. COMUNICACIÓN EN BUS 12C
Veamos las subrutinas más importantes llamadas desde la rutina principal. Primero
debemos iniciar una conversión, ya que estamos en modo one shot.
Comando de inicio
de conversión
START
Envía byte
(10010000)
Envía byte
(EEh)
STOP
retum
332
DS1621 termómetro y termostato en bus 12C
USERS
Luego de iniciar una nueva conversión de temperatura debemos esperar 750 ms a
que se complete. Transcurrido ese tiempo, estamos listos para leer la temperatura
medida.
Lee temperatura
ACKflag = O
START
Envía byte
(10010000)
Envía byte
(AAh)
START
Envía byte
(10010001)
Lee byte
(MSB)
ST 333
OP
11. COMUNICACIÓN EN BUS 12C
USERS
nuevamente, es decir, un START repetido (Sr) para cambiar la dirección de envío al
enviar el byte 10010001, con el bit R/W a 1. Luego de esto, ya podemos leer los bytes
que enviará el DS1621 con la lectura de la temperatura. Primero se recibe el MSB e
inmediatamente después el ISB. Es importante observar cómo, antes de leer el LSB, se
coloca el ACKflag en I para indicar que éste es el último byte a leer, y de esa forma
hacer que la subrutina de lectura de la librería 12C.INC envíe un bit NACK al final.
Una vez leídos los dos bytes correspondientes a la temperatura, se envía la condición
de STOP. Ahora sólo resta convertir los valores leídos a un formato adecuado y enviar
la lectura al display para poder observarla.
334 USERS
DS1621 termómetro y termostato en bus 12C
335
12C
Otros dispositivos
Por supuesto, ésta es sólo una muestra de los dispositivos 12C que podemos
encontrar disponibles para nuestros proyectos. Existen muchos más con las
mismas o diferentes funciones que los descritos, sólo es cuestión de
animarnos a investigar sobre el tema. De cualquier forma, debemos tenerlos
en cuenta ya que los dispositivos 12C pueden resultarnos de gran utilidad en
multitud de proyectos.
nuestra imaginación.
336
En este capítulo final hemos estudiado la comunicación entre el PIC16F84A y los
dispositivos que usan el protocolo de bus 12C para comunicación serial. La gran variedad
de dispositivos 12C en el mercado nos permite lograr aplicaciones de lo más variadas, y
complementan al PICI 6F84A para lograr diseños muy versátiles y con una gran facilidad.
Con esto finalizamos el estudio del PIC16F84A.
USERS
TEST DE AUTOEVALUACIÓN PRÁCTICAS
1 ¿Qué es el bus 12C?
Escriba en MPLAB los dos programas de
la sección Expansor de puertos 12C
2 ¿Qué función tienen las líneas SDAySCL en
PCF8574, ensámblelos, grábelos en el
el bus 12C?
PIC16F84A y compruebe su
funcionamiento en el circuito
3 ¿Para qué sirven los resistores de pull-
correspondiente.
up (Rp) en el bus?
4 ¿Cuáles son los valores recomendados 2 Diseñe una librería que permita
para los resistores de pull-up? manejar el display LCD conectado a un
expansor de puertos PCF8574.
5 ¿Quién debe generar la señal de reloj
para el bus?
3 Diseñe una librería que permita
manejar un teclado de 4x4 conectado a
6 ¿Qué tipo de condición debe enviar el
un expansor PCF8574.
maestro al bus para iniciar la transmisión
de datos?
4 En el programa del termómetro con
7 ¿Cuál es la condición para detener la DS1621 se leen los valores de TH y TL
transmisión? para comprobar si son los deseados, si
no es así, se escriben. Esto no se hace
8 ¿Cómo se llama el bit que se debe enviar con el registro de configuración. Por 10
en el noveno pulso de reloj? tanto, agregue las rutinas necesarias al
programa para que la comparación se
9 ¿Cuál es la función del circuito integrado haga también con los dos bits más
PCF8574? bajos de este registro y si ya están a I
no se escribirán.
IO ¿Cuál es la función del circuito integrado 5 Diseñe un termómetro y termostato para
DS1621? un acuario que le permita mantener la
temperatura del agua en los rangos encendiendo o apagando
recomendados en forma automática, el calefactor, según se
necesite.
Servicios al
lector
Para terminar, en este apartado encontraremos
338 USERS
Acumulador 15 Compiladores 23
Alto nivel 54 Componentes 20
ALU 15 CONFIG 145/146/254
Anodo común 204/205 Contador de programa 41/180
Asm 93
Atmel
24
DDRAM 214
ÍNDICE TEMÁTICO
c
CBLOCK 99/100/101/199
Índice temático
INC 1 12
INCLUDE 104
INDF 252 NACK 332
Instrucciones 57/58
INTCON 232/280
Intel 19 OPTION 230
340 USERS
Interruptores 37/185 Oscilador 31
OST 34
JDM 133/134
Palabras reservadas 98
PCF8574 338/339/340/341
PIC16F84A 19/57/352
Macros 272/273/275//277 PIC18 19
Maestro/esclavo 327/330/331 PICkit 2 132/147
USERS
361
SERVICIOS AL LECTOR
PICkit 3 132
Pila 1 63/164 Salto condicional 167
Pines 24 Salto incondicional 165/172
PORTA 44/109 Saltos indexados 191/195
PORTB 44/109 SCL 326/329
Power-on reset 33 SDA 326/329
Power-up timer 34 Señal de reloj 31
Prescaler 229/230/232 SFR 42/43/106/121
Pulsadores 37/185
Punto de ruptura 123
Tablas en ROM 191/192/193
RBO 25
RC 32
Registro de banderas 45 UNDEFINE 104
Registro de configuración 144/145/ Unidades de entrada/salida 16
342
146/147
Registro de datos 212
Registro de instrucciones 212 Valores binarios
Reset 31 Vss 25
Resistores 304
Retardos 176/184/188
RISC 52/57 WDT 33/229/254/255/258
USERS
Suele haber grandes diferencias de precio entre libros del mismo tema; si no tiene el valor en la tapa, pregunte y compare.
5 Verifique el idioma
No sólo el del texto; también revise
que las pantallas incluidas en el libro
estén en el mismo idioma del
programa que usted utiliza.
6 Revise la fecha de
publicación
usershop.redusers.com
usershop.redusers.com
4
Está en letra pequeña en las primeras páginas; si es un libro traducido, la que
vale es la fecha de la edición original.
Utilice nuestro sitio usershop.redusers.com:
• Vea información más detallada sobre cada libro de
este catálogo.
• Obtenga un capítulo gratuito para evaluar la posible
compra de un ejemplar.
Unix
Este libro es la guía adecuada clara, sencilla y didáctica. fallas y pro• blemas avanzados,
para iniciarse en el mundo del RESPUESTAS fabricar dispositivos inalámbricos
mdelado. Conoceremos todos los 320 piginas / ISBN 978.%7-1347-91-9 caseros de alto alcance, y
constructores y elementos también a sacarle el máximo
necesarios para comprender la Esta obra expone una visión
provecho a nuestra notebook-
construcción de modelos V global de las técnicas que los
MANUALES USERS
razonarlos de manera que hackers maliciosos utilizan en la
actualidad para conseguir sus
usershop.redusers.com
320 pigin.s/ ISBN 978.%7.
'347.Ð.2
Ésta es una obra que brinda las En esta obra encontraremos un Esta obra es una herramienta
impre-
herramientas para convertirnos en material sin desperdicios que nos scindible pata dominar las principa.
expertos en el soporte y la repara- permitirá entender los sintomas que les herramientas del paquete más
cián de los componentes internos presentan los problemas graves, famoso de Adobe y para conocer
los
de la PC. Está orientada a quienes solucionarlos en caso de que algún secretos utilizados por los expertos
quieran aprender 0 profundizar Sus imprevisto nos sorprenda y, final- del diseño para trabajar de maneta
conocimientos en el área. mente, evitar que se repitan. profes.onal.
Esta obra es una guia básica que Una guia básica que responde. en Este libro es una obra con un erara
responde, en forma v•sual y práctica, forma Visual y práctica. a todas las enfoque en lo práctico. plasmado
en
a todas las preguntas que necesita. preguntas que necesitamos conocer ejemplos no sólo útiles también
mos plantearnos para conocer y para dorrunar la versión Ü7 de la reales; orientada a los
profesionales
dominar el mundo de las redes popular suite de Microsoft Definico• que tlenen la necesidad de aportar
a
hogareñas. tanto cableadas como nes, consejos, claves y secretos, expli—• sus empresas soluctones
confiables,
Wi.Fi. cados de manera clara y didáctica. a muy bajo costo.
COLECCION: 203 RESPUESTAS » COLECCION: al RESPUESTAS cou-CCltN: PROFESSIONAL
320 paginas,' ISBN 320 páginas ISBN -9 2S paginas/ IS3N
[email protected]
Este libro brinda las Curso COLECCIÓN: DESARROLLADORES
herramientas de análisis y los 400 páginas / ISBN 978-987-1347-
conocimientos necesarios para 76-6
lograr un sitio con presencia Esta obra es una guía básica que
sólida y alta tasa de efectividad. responde, en forma visual y práctica,
Una obra imprescindible para a todas las preguntas que
entender la manera en que los necesitamos hacernos para dominar
el hardware de la PC. Definiciones,
negocios se llevan a cabo en la
consejos, claves y secretos de los
actualidad.
profesionales, explicados de manera
clara, sencilla y didáctica.
COLECCION: PROFESSIONAL
TOOLS COLECCIÓN: 200 RESPUESTAS
288 páginas / ISBN 978-987-1347-
320 páginas/ ISBN 978-987-1347-
82-7
83-4
de programación C#
Este libro es un completo curso
de programación con C# desde
cero. Ideal tanto para quienes
desean migrar a este potente
lenguaje, como para quienes PRODUCCIÓN
quieran aprender a programar,
incluso, sin tener conocimientos
previos.
usershop.redusers.com
COLECCIÓN: DESARROLLADORES
Una Obra absolutamente electricidad y electrónica, explicando en detalle las herramientas e
increíble, con los mejores 101 instrumentos más importantes.
secretos para dominar la última
versión de Windows. En sus COLECCIÓN: MANUALES USERS
páginas encontraremos un -¥ 352 páginas / ISBN 978-987-1347-73-5
material sin desperdicios, ideal Este libro es una guia de referencia Esta es una obra visual y práctica,
para quienes quieren llevar el y consulta permanente que brinda en la que aprenderemos a usar los
rendimiento de su PC al limite. acceso instantáneo a las funciones principales dispositivos
de Excel 2007, y sin duda se tecnológicos de la actualidad. Un
convertirá en un material libro fundamental para estar
COLECCION: MANUALES USERS
indispensable para quienes quieran preparados y ser partícipes del
352 páginas / ISBN 978-987-1347-
potenciar sus planillas de cálculo. cambio tecnológico que estamos
80-3 viviendo.
7477 w
h
o
4120
s
e
e
k
PIC
MICROC t
ONTROLL o
ERS
e n
n
t a
e b
r o
u
t t
h
e t
h
w e
o
r t
l h
d e
o
o r
f y
m a
i n
c d
r
o t
c h
o e
n
t
p
r
r
o
a
l
c
l
t
e
i
r
c
s
a
.
l
P
a
r
s
o
p
j
e
e
c
c
t
t
s
s
o
a
f
i
m
e t
d h
i
s
t
o
d
e
l
v
e
i
a
c
r
e e
s s
.
t
A o
m p
a r
t o
e g
r r
i a
a m
l ,
f w
u r
l i
l t
e
o
f a
n
v d
i
s e
u r
a a
l s
e
g
u c
i h
d i
e p
s s
a f
n o
d r
s u
t s
e a
p g
e
b
y i
n
s
t r
e e
p a
l
g
u p
i r
d o
j
e
c
t
s
.
SEHSMA
NUALeS
U S t: S M A
N UA LE S U
S t: H S M A
INCLU
YE
PROYE
CTOS
REALE
S