Microcontroladores
Tercer ciclo
2009
CARRERAS PROFESIONALES CIBERTEC
MICROCONTROLADORES
3
ÍNDICE
Presentación 3
Red de contenidos 5
Unidad de aprendizaje 1
SEMANA 1 : El microprocesador 6
SEMANA 2 : Registros e instrucciones 14
Unidad de aprendizaje 2
SEMANA 3 : El PIC16F84: Capacidades, puesta en marcha y 25
arquitectura interna.
SEMANA 4 : EL PIC16F84: Memoria, registros y funciones. 32
Unidad de aprendizaje 3
SEMANA 5 : Juego de instrucciones y acceso a los puertos. 41
SEMANA 6 : Acceso a la memoria RAM y Temporización. 53
SEMANA 7 : Examen parcial.
SEMANA 8 : Interrupciones y palabra de configuración 65
Unidad de aprendizaje 4
SEMANA 9 : El PIC16F877: Capacidades, puesta en marcha y 75
arquitectura interna
SEMANA10 : El PIC16F877: Memorias, registros y funciones 82
SEMANA11 : Juego de instrucciones, acceso de puertos y RAM. 101
SEMANA12 : Temporización. 119
CIBERTEC CARRERAS PROFESIONALES
4
SEMANA13 : Comunicación serial y conversión análoga digital. 132
SEMANA14 : Interrupciones. 149
SEMANA15 : Presentación de proyectos.
SEMANA16 : Presentación de proyectos.
PRESENTACIÓN
Microcontroladores pertenece a la línea de tecnología y se dicta en la carrera
de Electrónica. El curso entrega un conjunto de conocimientos y métodos
técnicos que permiten a los alumnos concebir el funcionamiento de los
microcontroladores, distinguir sus potencialidades y utilizarlos apropiadamente
como herramientas aplicativas en sus proyectos personales y profesionales.
El manual del curso ha sido estructurado en unidades de aprendizaje, las que
se desarrollan por semanas. En cada una de ellas encontrara los alcances que
se deben lograr, los temas a tratar y los contenidos que se deben examinar. Por
último encontrará las actividades que se deben desarrollar en cada sesión, que
le permitirán reforzar lo aprendido en la clase.
El curso es teórico – práctico. Se tiene un taller donde se llevan a cabo las
prácticas de laboratorio. Se iniciará con la comprensión y programación de un
sistema basado en microprocesador. Se continúa con la descripción,
programación y montaje de circuitos con el Microcontrolador PIC16F84, que es
un microcontrolador de mediana complejidad. Y se culmina con el
Microcontrolador PIC16F877, que es uno de mayores capacidades y de
funciones más complejas.
CARRERAS PROFESIONALES CIBERTEC
MICROCONTROLADORES
5
RED DE CONTENIDOS
Microcontroladores
Microcontroladores
PIC16F84
Microprocesador PIC16F877
Sistema Juego Arquitectura Memoria
basado en de y s
Microprocesador Instrucciones Puesta en marcha y
Programación de los PICs
Juego de instrucciones Temporización y
y Configuración Acceso a los Puertos Comunicación serial
y a memoria RAM
CIBERTEC CARRERAS PROFESIONALES
6
UNIDAD DE
APRENDIZAJE
1
SEMANA
EL MICROPROCESADOR
LOGRO DE LA UNIDAD DE APRENDIZAJE
Al terminar la unidad, los alumnos podrán enunciar los elementos que conforman
un sistema basado en Microprocesador indicando la función de cada uno de estos
en forma escrita, clara y concisa.
Al terminar la unidad, los alumnos podrán desarrollar programas básicos de
lectura y escritura de información, en base a la manipulación de los registros y
celdas de memoria Ram. Los programas se realizarán en el computador y
deben resolver por lo menos el 80% de las funciones.
TEMARIO
Reseña histórica del primer microprocesador
El microprocesador
Sistema basado en microprocesador
ACTIVIDADES PROPUESTAS
Los alumnos destacan la complejidad de los microprocesadores.
Los alumnos establecen diferencias entre las unidades de memoria e I/O.
Los alumnos describen los buses de comunicación.
Los alumnos distinguen las funciones de lectura y escritura del
microprocesador.
CARRERAS PROFESIONALES CIBERTEC
MICROCONTROLADORES
7
1. RESEÑA HISTORICA DEL PRIMER MICROPROCESADOR
En 1969, la empresa Busicom, una joven empresa japonesa, fue a la compañía Intel
en Silicon Valley - California, el centro de la industria de los semiconductores, para que
desarrollen un conjunto chips para el corazón de su nueva calculadora.
Al principio se pensó que el proyecto no era viable, ya que Intel no contaba con lo
necesario para realizar circuitos específicos. Pero Marcian Edward Ted Hoff, jefe del
departamento de investigación de aplicaciones, pensó que habría una mejor forma de
realizar el trabajo.
Hoff, ayudado por Stanley Mazor, crearon una
arquitectura formada por una CPU de 4 bits, una
memoria ROM (de sólo lectura) para almacenar las
instrucciones de los programas, una RAM (memoria de
lectura y escritura) para almacenar los datos y algunos
puertos de entrada/salida para la conexión con el
teclado, la impresora, las llaves y las luces. También
definieron y verificaron el conjunto de instrucciones con
la ayuda de ingenieros de Busicom.
En abril de 1970 Federico Faggin integró el staff de Intel. Su trabajo era terminar el
conjunto de chips de la calculadora. Se suponía que Hoff y Mazor habían completado
el diseño lógico de los chips y solamente quedaría definir los últimos detalles para
comenzar la producción. Esto no fue lo que Faggin encontró cuando comenzó a
trabajar en Intel.
Shima, Ingeniero enviado desde Japón esperaba revisar la lógica de diseño,
confirmando que Busicom podría realizar su calculadora. Se puso furioso cuando vio
que estaba todo igual que cuando había ido seis meses antes, con lo que dijo (en lo
poco que sabía de inglés) "Vengo acá a revisar. No hay nada para revisar. Esto es sólo
idea".
De esta manera, Faggin tuvo que trabajar largos meses, de 12 a 16 horas por día.
Finalmente pudo realizar los cuatro chips arriba mencionados y los llamó "familia
4000". Estaba formado por cuatro dispositivos de 16 pines: el 4001 era una ROM de
dos kilobits con salida de cuatro bits de datos; el 4002 era una RAM de 320 bits con el
port de entrada/salida (bus de datos) de cuatro bits; el 4003 era un registro de
desplazamiento de 10 bits con entrada serie y salida paralelo; y el 4004 era la CPU de
4 bits.
El 4001 fue el primer chip diseñado y terminado. La primera fabricación ocurrió en
octubre de 1970 y el circuito trabajó perfectamente. En noviembre salieron el 4002 con
un pequeño error y el 4003 que funcionó correctamente. Finalmente el 4004 vino unos
pocos días antes del final de 1970. Fue una lástima porque en la fabricación se habían
olvidado de poner una de las máscaras. Tres semanas después vinieron los nuevos
4004, con lo que Faggin pudo realizar las verificaciones. Sólo encontró unos pequeños
errores. En febrero de 1971 el 4004 funcionaba correctamente. En el mismo mes
recibió de Busicom las instrucciones que debían ir en la ROM.
A mediados de marzo de 1971, se enviaron los chips a Busicom, para verificar que la
calculadora funcionaba correctamente. Cada calculadora necesitaba un 4004, dos
CIBERTEC CARRERAS PROFESIONALES
8
4002, cuatro 4001 y tres 4003. Tomó un poco menos de un año desde la idea al
producto funcionando perfectamente.
Luego de que el primer microprocesador fuera una realidad, Faggin le pidió a la
gerencia de Intel que utilizara este conjunto de chips para otras aplicaciones. Esto no
fue aprobado, pensando que la “familia 4000” sólo serviría para calculadoras. Además,
como fue producido mediante un contrato exclusivo, sólo lo podrían poner en el
mercado teniendo a Busicom como intermediario.
Después de hacer otros dispositivos utilizando la “familia 4000”, Faggin le demostró a
Robert Noyce (entonces presidente de Intel) la versatilidad de estos integrados para
uso general. Finalmente Intel llegó a un arreglo con Busicom: Intel le devolvió los
60000 dólares que había costado el proyecto, sólo podría vender los integrados para
aplicaciones que no fueran calculadoras y Busicom los obtendría más baratos
El 15 de noviembre de 1971, la “familia 4000”, luego conocida como MCS-4 (Micro
Computer System 4-bit) fue finalmente introducida en el mercado.
1.1 El Microprocesador
Desde la invención del primer microprocesador (4004) estos CHIPs han sido
perfeccionados año tras año, convirtiéndose actualmente en los ICs más potentes y
complejos tecnológicamente. Los microprocesadores de hoy son capaces de procesar
muchísima mas información y a muchísima mayor velocidad que el legendario 4004.
El microprocesador, también conocido como CPU (unidad central de proceso) es un
circuito integrado semiconductor formado por la integración de millones de
transistores, interrelacionados entre si para formar el circuito mas complejo que la
electrónica haya realizado. Sin embargo, su función es lógica, “simple” y repetitiva,
procesa toda la información de cualquier sistema electrónico a través de la lectura,
interpretación y ejecución de instrucciones. Esta forma de operar maduró y se aplicó
gracias al aporte de Jhon Von Newman.
1.1.1 Arquitectura de Von Newman
Fue un matemático húngaro nacionalizado estadounidense que concibió la
arquitectura de los procesadores modernos y se baso en los conceptos de:
- Programa almacenado y
- Ruptura de la secuencia de programa mediante la toma de decisiones.
El siguiente esquema refleja esta concepción:
CARRERAS PROFESIONALES CIBERTEC
MICROCONTROLADORES
9
Cada elemento de esta arquitectura tiene su función:
[Link] Memoria
Es el dispositivo que almacena el programa a ejecutar en forma de secuencia de
instrucciones.
[Link] Unidad de Control
Es la unidad encargada de enviar consecutivamente las instrucciones del programa,
desde la memoria hasta la unidad de proceso.
[Link] Unidad de Proceso
Es la unidad encargada de interpretar y ejecutar las instrucciones. La ejecución causa
alguna acción sobre la memoria o sobre las unidades de entrada o salida.
[Link] Unidad de E/S
Es la unidad encargada de enlazar la comunicación con el mundo exterior, es decir,
con el ser humano. Recibe y representa los datos y resultados de forma asequible
para éste.
[Link] Reloj
Es el dispositivo encargado de poner en marcha y sincronizar todo el sistema.
Si se une la unidad de proceso y la unidad de control se crea el microprocesador, así,
el esquema mejorado sería:
Con lo que podemos afirmar que el microprocesador gobierna el funcionamiento de las
unidades de E/S, según sea el programa (instrucciones) almacenado en la memoria y
al ritmo de los pulsos de la señal de reloj.
1.2 Sistema basado en microprocesador
La arquitectura de Von Newman echo muchas luces al desarrollo de los procesadores
y en base a su concepción todos los sistemas basados en microprocesador necesitan
de memorias y unidades de entrada/salida. Las memorias son necesarias porque en
estas se depositan los datos e instrucciones que gobiernan el funcionamiento del
sistema. Y las unidades de entrada/salida son las que permiten interactuar al
microprocesador con el mundo exterior o si se quiere, permiten que el mundo exterior
acceda a los servicios del microprocesador.
CIBERTEC CARRERAS PROFESIONALES
10
1.2.1 Sistema mínimo
Un sistema mínimo estaría formado por el microprocesador, una memoria rom, una
memoria ram, una interfase de entrada y otra de salida. Todos estos elementos deben
interactuar con el microprocesador y para ello se hace necesaria la comunicación, la
cual se realiza a través de los llamados buses de comunicación.
1.2.2 Buses de comunicación
Los buses de comunicación están formados por los buses de datos, de dirección y de
control. Su importancia radica en facilitar, ordenar y sincronizar la comunicación entre
los elementos del sistema.
[Link] Bus de datos
Este bus es el canal de transporte por donde viaja la información (instrucciones y
datos), entre el microprocesador y los elementos externos (memorias e I/O). El tamaño
de este bus determina la cantidad de información que se puede transferir en un
instante de reloj, el primer microprocesador tenía 4 bits de datos, uno actual posee 64
bits.
[Link] Bus de dirección
Este bus es el seleccionador de la comunicación. A través de este el microprocesador
elige a uno de los elementos externos (memorias e i/o) que se comunicará con el; los
demás elementos externos no intervienen en la comunicación seleccionada. El tamaño
de su bus determina la capacidad de habilitación del microprocesador, a mayor bus
mayor capacidad y cantidad de elementos externos que puede seleccionar. El 4004
tenía 13 bits de dirección, los procesadores actuales sobrepasan los 40 bits.
[Link] Bus de control
Este bus es el que establece con que tipo de elemento externo se realizará la
comunicación y además define en que sentido se realizará. Es decir, el
microprocesador debe saber si se comunicará con memorias o unidades de
entrada/salida y si la información se transmitirá sobre estas o se recibirá de estas. Si la
información va salir del microprocesador este activará la escritura de información, pero
si la información va entrar al microprocesador este activará la lectura de información.
CARRERAS PROFESIONALES CIBERTEC
MICROCONTROLADORES
11
1.2.3 Secuencia funcional
Luego de energizado el microprocesador, debe recibir un impulso llamado RESET que
le permita inicializar todo su sistema interno. Luego de esta inicialización el
Microprocesador buscará su primera instrucción la cual debe estar en la primera celda
de la memoria ROM. Para esto debe realizar la siguiente secuencia operativa:
1- Se coloca en el bus de dirección la dirección de la primera celda de ROM.
2- Se activa el bus de datos dejando listo este canal para la transferencia.
3- Se indica en el bus de control que se trabajará con memoria y además se
activa la lectura de información.
En este instante la primera instrucción sale de la memoria ROM y viaja por el
bus de datos hacia el interior del microprocesador.
4- Se desactivan los buses de comunicación.
5- Internamente se decodifica la instrucción recibida.
Después de la decodificación, el microprocesador sabe que elementos internos
o externos intervendrán y en que orden lo harán para ejecutar esta instrucción.
6- Se ejecuta la instrucción según lo decodificado.
La ejecución de una instrucción siempre culmina con la transferencia de información.
Esta información puede:
a) Escribirse sobre alguna celda de memoria RAM
b) Escribirse sobre alguna unidad de salida OUT
c) Leerse de alguna celda de memoria RAM
d) Leerse de alguna unidad de entrada IN
e) O simplemente quedarse en el interior (registro) del microprocesador.
[Link] Escritura sobre RAM
El microprocesador realizaría la siguiente secuencia:
1- Se coloca en el bus de dirección la dirección de la celda de RAM que recibirá el
dato.
2- Se activa el bus de datos y se coloca en este el dato a transferir.
3- Se indica en el bus de control que se trabajará con memoria y además se
activa la escritura de información.
En este instante el dato colocado en el bus de datos es transferido desde el interior
del microprocesador hacia la celda de memoria RAM direccionada.
4- Se desactivan los buses de comunicación.
[Link] Lectura de una unidad de entrada
El microprocesador realizaría la siguiente secuencia:
1- Se coloca en el bus de dirección la dirección de la unidad de entrada de donde
provendrá el dato.
2- Se activa el bus de datos dejando listo este canal para la transferencia.
3- Se indica en el bus de control que se trabajará con una unidad de entrada y
además se activa la lectura de información.
En este instante el dato viaja desde la unidad de entrada seleccionada hacia el
interior del microprocesador.
4- Se desactivan los buses de comunicación.
CIBERTEC CARRERAS PROFESIONALES
12
[Link] Función “simple” y repetitiva
Las instrucciones se encuentran almacenadas en la memoria y ordenadas una de tras
de la otra para su ejecución secuencial. Culminada la ejecución de la primera
instrucción, el microprocesador procede con la siguiente instrucción, para lo cual,
repite los pasos de la secuencia funcional (pasos 1 al 6) pero teniendo en cuenta la
dirección de la celda de memoria que contiene la segunda instrucción. Culminada la
ejecución de esta, se repiten otra vez los pasos pero con la dirección de la celda que
contiene la tercera instrucción. Este procedimiento se repite una y otra vez con el
conjunto de instrucciones de la memoria que forman el programa.
CARRERAS PROFESIONALES CIBERTEC
MICROCONTROLADORES
13
Resumen
El Microprocesador es el chip mas avanzado integrado por millones de
transistores. El primer Microprocesador fue el 4004 y lo desarrollo Intel.
Un sistema basado en Microprocesador lo constituyen las memorias, las unidades
de entrada y salida, y el Microprocesador.
Los buses de comunicación son tres: El bus de datos, dirección y control. Estos
sirven para establecer el orden y sincronizmo de comunicación de un sistema.
Tras la energización del Microprocesador, este empieza a realizar su función
simple y repetitiva de leer, interpretar y ejecutar las instrucciones de la memoria.
Si desea saber más acerca de estos temas, puede consultar las siguientes
páginas.
8 [Link]
Aquí hallará información introductoria a los Microprocesadores.
8 [Link]
En esta página, hallarás los temas realizados más ampliamente.
CIBERTEC CARRERAS PROFESIONALES
14
UNIDAD DE
APRENDIZAJE
1
SEMANA
REGISTROS E INSTRUCCIONES
LOGRO DE LA UNIDAD DE APRENDIZAJE
Al terminar la unidad, los alumnos podrán enunciar los elementos que conforman
un sistema basado en Microprocesador indicando la función de cada uno de estos
en forma escrita, clara y concisa.
Al terminar la unidad, los alumnos podrán desarrollar programas básicos de
lectura y escritura de información, en base a la manipulación de los registros y
celdas de memoria Ram. Los programas se realizarán en el computador y
deben resolver por lo menos el 80% de las funciones.
TEMARIO
Registros del Microprocesador
Instrucciones del Microprocesador
Desarrollo de programas
ACTIVIDADES PROPUESTAS
Los alumnos distinguen los registros del Microprocesador.
Los alumnos identifican y describen las instrucciones del Microprocesador.
Los alumnos transfieren información entre registros.
Los alumnos transfieren información entre registros y memoria.
CARRERAS PROFESIONALES CIBERTEC
MICROCONTROLADORES
15
1. REGISTROS DEL MICROPROCESADOR
Los registros son unidades de almacenamiento temporal
que se encuentran en el interior del microprocesador. Son
fundamentales para alimentar con información a los
procesos internos del Microprocesador que es realizado por
la unidad aritmética lógica (ALU). Esta unidad se encarga
de las operaciones lógicas como NOT, AND, OR, XOR,
desplazamientos hacia la derecha o izquierda de la
información de los registros, entre otras operaciones
lógicas. También se encarga de realizar las operaciones
aritméticas de suma, resta, multiplicación y división. El
resultado de cualquiera de estas operaciones es transferido
por defecto el ACUMULADOR, el registro más importante
de todo Microprocesador, pero de ser necesario este
resultado puede ser transferido sobre cualquier otro
registro. Posteriormente, estos resultados almacenados en
los registros se pueden transferir hacia la memoria o alguna
unidad de salida, según se requiera.
1.1 Registros del Microprocesador 8086
Todos los microprocesadores de la familia Intel conservan equivalencia, es decir, los
registros que encontremos en el procesador 8086 también los tendremos en un
procesador actual. Aunque obviamente los procesadores actuales cuentan con más
registros.
1.1.1 Registros de propósito general
Los registros de propósito general sirven para la ejecución de cualquier proceso,
desde una simple transferencia hasta las operaciones lógicas y aritméticas. Estos
registros son de 8 bits cada uno y están designados por las letras A, B, C y D. La H
significa high (alto) y la L significa low (bajo).
AH AL
BH BL
CH CL
DH DL
Si juntamos los registros de las mismas letras tendríamos registros de 16 bits:
REGISTROS DE 8 BITS DE 16 BITS NOMBRE
AH AL AX Acumulador
BH BL BX Base
CH CL CX Contador
DH DL DX Datos
CIBERTEC CARRERAS PROFESIONALES
16
1.1.2 Registros índices
Estos registros tienen la función especial de direccionar al inicio de algún bloque de
memoria para realizar sobre este, transferencia de información, o salvar
temporalmente direcciones de memoria que responden a ejecuciones de programas
previos.
SI Índice origen
DI Índice destino
BP Puntero base
SP Puntero de pila
1.1.3 Registros de segmento
Estos registros tienen la función de definir bloques de memoria de 64K. Direccionan de
modo fijo a la celda de inicio de estos bloques. Estos bloques son destinados para
almacenar datos y/o instrucciones.
CS Segmento de códigos
DS Segmento de datos
ES Segmento extra
SS Segmento de pila
1.1.4 Registro puntero de instrucciones
Este registro tiene la función de apuntar a las instrucciones de un programa para su
tratamiento. De modo automático direcciona a la siguiente instrucción una vez que la
anterior ya fue decodificada.
IP Puntero de instrucciones
1.2 Instrucciones del microprocesador
Las instrucciones son órdenes que el microprocesador puede reconocer, interpretar y
ejecutar. Estas se encuentran agrupadas según sus funciones: De transferencia,
lógicas, aritméticas y de transferencia de control. No abarcaremos el desarrollo de
todas las instrucciones, bastará con las instrucciones de transferencia y transferencia
de control.
1.2.1 Instrucciones de transferencia
Estas instrucciones permiten copiar información de un operando fuente hacia otro
operando destino. La información del operando fuente nunca se altera, en cambio la
información del operando destino es reemplazado
por la información del operando fuente. Los
operandos fuente o destino podrían ser un registro,
una celda de memoria, una unidad de entrada o
una de salida.
CARRERAS PROFESIONALES CIBERTEC
MICROCONTROLADORES
17
Su sintaxis es MOV DESTINO, FUENTE
Donde MOV es la instrucción y significa mover (copiar), mientras que DESTINO y
FUENTE son los operandos. La fuente proveerá la información y el destino
obviamente recibirá una copia de la información de la fuente.
El elemento FUENTE puede ser un número, un registro o una celda de memoria,
mientras que el DESTINO puede ser un registro o una celda de memoria.
[Link] Transferencias con FUENTE numérica
Cuando la FUENTE es un número este puede ser expresado en formato decimal,
hexadecimal o binario. Mientras que, el destino puede ser un registro o una celda de
memoria. A continuación veamos algunos ejemplos que utilizan como destino a los
registros:
MOV AL, 0 ; AL = 0
MOV BH, 55h ; BH = 55h
MOV CL, 10101011b ; CL = 10101011b
Los comentarios de las instrucciones no influyen sobre la ejecución de las
instrucciones, pero ayudan a entender mejor el procedimiento y pueden ser
expresados colocando previamente punto y coma sobre la línea que se desea
comentar.
A continuación más ejemplos:
MOV AX, 1000 ; AX = 1000
MOV BX, 3AC5h ; BX = 3AC5h
MOV CX, 1000010010011011b ; CX = 1000010010011011b
[Link].1 Escritura de un número sobre memoria
Cuando el destino es una celda de memoria, esta se tendría que indicar de modo
indexado a través del registro BX, tal como se muestra a continuación:
MOV [BX], 20
MOV [BX], A7h
MOV [BX], 11110000b
MOV [BX], 5000
MOV [BX], 9EA7h
MOV [BX], 1111000011001010b
Cada uno de estos valores numéricos se transferiría hacia la celda de memoria
indicada en el registro BX, lo cual significa que estamos almacenando datos en
memoria, es decir, escribiendo en memoria.
Ejemplo específico: Transfiera sobre la celda de memoria 2000h el valor 150.
MOV BX, 2000h ; BX = 2000h (dirección de la celda)
MOV [BX], 150 ; (celda 2000h) = 150
CIBERTEC CARRERAS PROFESIONALES
18
[Link] Transferencias con FUENTE registro
Cuando la FUENTE es un registro el destino podría ser otro registro o una celda de
memoria. A continuación veamos algunos ejemplos que utilizan como destino a los
registros:
MOV AL, CH ; AL = CH
MOV BH, DL ; BH = DL
MOV CL, BL ; CL = BL
MOV AX, DX ; AX = DX
MOV DX, CX ; DX = CX
MOV BX, AX ; BX = AX
[Link].1 Escritura de un registro sobre memoria
Nuevamente, cuando el destino es una celda de memoria, esta se tendría que indicar
de modo indexado a través del registro BX, tal como se muestra a continuación:
MOV [BX], AH
MOV [BX], DL
MOV [BX], AL
MOV [BX], CH
MOV [BX], AX
MOV [BX], DX
MOV [BX], CX
[Link] Transferencias con FUENTE memoria
Cuando la FUENTE es una celda de memoria el destino sólo puede ser un registro. A
continuación veamos algunos ejemplos:
MOV AL, [BX]
MOV DL, [BX]
MOV CH, [BX]
MOV AH, [BX]
MOV AX, [BX]
MOV CX, [BX]
MOV DX, [BX]
Este tipo de transferencias se denomina Lectura de memoria, ya que, el contendido
de las celdas será transferido sobre algún registro del microprocesador.
Ejemplo específico: transfiera el contenido de la celda de memoria 4000h sobre el
registro AH.
MOV BX, 4000h ; BX = 4000h (dirección de la celda)
MOV AH, [BX] ; AH = (celda 4000h)
1.2.2 Instrucciones de transferencia de control
Estas instrucciones permiten la ruptura de la secuencia de un programa. Son
necesarias en las tomas de decisión de cualquier algoritmo.
Existen dos tipos de instrucciones que permiten la transferencia de control: Las de
salto incondicionado y obviamente las de tipo condicionado.
CARRERAS PROFESIONALES CIBERTEC
MICROCONTROLADORES
19
[Link] Transferencia de control incondicional
Esta instrucción rompe la ejecución secuencial de
cualquier programa, sin importar ningún tipo de
condición previa. Es decir, las instrucciones se
ejecutan en orden una tras otra, primero la
instrucción 1, luego la instrucción 2, enseguida la
instrucción 3 y así sucesivamente; pero, cuando
aparece en una celda de memoria este tipo de
instrucción, la secuencia se rompe y ya no permite
que la siguiente instrucción se ejecute.
Son necesarias para repetir la ejecución completa
del programa o ejecutar alguna función del
programa.
Su sintaxis es JMP ETIQUETA
Donde JMP es la instrucción que significa saltar y ETIQUETA es la dirección de la
celda de memoria a donde se desea saltar. El microprocesador tras ejecutar esta
instrucción modifica su registro IP con la dirección indicada en la ETIQUETA.
Recordemos que IP es el registro encargado de apuntar a las instrucciones que serán
tratadas (leídas, interpretadas y ejecutadas).
Ejemplo:
REPETICION:MOV AL,10
MOV BX,100h
MOV DL, CH
MOV CX,AX
JMP REPETICION
REPETICION es la etiqueta asociada a la instrucción MOV AL,10 y la instrucción JMP
REPETICION permite que el programa se repita desde MOV AL,10 una y otra vez por
siempre.
[Link] Transferencia de control condicionado
Estas instrucciones rompen la ejecución secuencial de
un programa siempre que se cumpla alguna condición
previa. Es decir, antes de una instrucción de salto
condicionado siempre existirá una instrucción de
comparación. El resultado de una comparación puede
generar tres posibilidades: que los operandos
comparados sean iguales, que el primer operando sea
mayor que el segundo o que el primer operando sea
menor que el segundo operando. La instrucción de salto
condicionado se sirve de estos resultados y trunca o no
la secuencia del programa según sea la conveniencia.
Si nos importa saber que los valores son iguales y
queremos ejecutar o repetir alguna función por tal caso,
utilizaremos la instrucción JE ETIQUETA, que significa
salta a la dirección indicada en la etiqueta si los valores
comparados son iguales, tal como se muestra en la
figura de la derecha. Si nos importa que el primer
operando sea mayor que el segundo, utilizaremos JA
ETIQUETA y si deseamos saber que el primer operando sea menor que el segundo
usaremos JB ETIQUETA.
CIBERTEC CARRERAS PROFESIONALES
20
Si la condición no se cumple, la ejecución secuencial del programa continua, es decir,
se ejecuta la siguiente instrucción, la que esta justo después del salto condicionado.
[Link].1 Variantes de las instrucciones de salto
Si combinamos estas instrucciones básicas de salto obtenemos:
JAE ETIQUETA salta si el primer operando es mayor o igual que el segundo.
JBE ETIQUETA salta si el primer operando es menor o igual que el segundo.
JNE ETIQUETA salta si los operandos no son iguales.
JNB ETIQUETA salta si el primer operando no es menor que el segundo operando.
JNA ETIQUETA salta si el primer operando no es mayor que el segundo operando.
[Link] Instrucciones de comparación
Las instrucciones de comparación permiten comparar dos operandos. El primer
operando puede ser un registro o una celda de memoria, mientras que el segundo
operando podría ser un número, un registros o una celda de memoria.
Su sintaxis es CMP OP1, OP2
Donde CMP es la instrucción de comparación, OP1 es el primer operando y OP2 el
segundo. Veamos algunos ejemplos:
CMP AL, 10 ; Se compara el registro AL con el número 10
CMP DH, BL ; Se compara el registro DH con el registro BL.
CMP AH, [BX] ; Se compara el registro AH con la celda direccionada por BX.
CMP CX, DX ; Se compara el registro CX con el registro DX.
CMP [BX], 4 ; Se compara la celda direccionada por BX con el número 4.
CMP [BX], AL ; Se compara la celda direccionada por BX con el registro AL.
Ejemplos de uso del salto condicionado
INICIO: MOV AL, 100 BEGIN: MOV AX, 1055h
MOV BX, 4300h MOV BL, 19
REPITE: MOV DL, CH MOV CX, DX
MOV CX, AX CMP AX, DX
CMP AL, DL JA SUBIR
JNE REPITE MOV AL, 50
MOV AL, 21 MOV DX, 5678
MOV DX, 8000 SUBIR: MOV AL, 50
MOV DX, 5678
MOV CX, AX
CMP AL, DL
Mientras el valor del registro AL y DL sean Si el valor del registro AX es mayor que el valor
diferentes el programa se ejecutar desde la del registro DX el programa se ejecutará desde
etiqueta REPITE, evitando la ejecución de las la etiqueta SUBIR, evitando la ejecución de las
instrucciones MOV AL, 21 y MOV CX, 8000. instrucciones MOV AL,50 y MOV DX, 5678.
CARRERAS PROFESIONALES CIBERTEC
MICROCONTROLADORES
21
1.3 Desarrollo de programas
A continuación se proponen problemas y se dan solución utilizando las instrucciones
de transferencia, comparación y transferencia de control.
1.3.1 Programas de transferencia
1- Transfiera los valores 10, 75h y 221 hacia los registros CH, BL y AH
respectivamente.
INICIO: MOV CH,0
MOV BL,75h
MOV AH,221
2- Transfiera sobre los registros DX, AL, CX y BH los valores 9Fh, 100, 3521h y 0
respectivamente.
INICIO: MOV DX,9Fh
MOV AL,100
MOV CX,3521h
MOV BH,0
3- Transfiera los valores 1000 y 50 sobre los registros CX y BH y estos a su vez sobre
los registros DX y AL respectivamente.
INICIO: MOV CX,1000
MOV BH,50
MOV DX,CX
MOV AL,BH
4- Transfiera sobre la celda de memoria 4000h el valor 200.
INICIO: MOV BX,4000h
MOV [BX],200
5- Transfiera sobre la celda de memoria 7000h el valor 2000h.
INICIO: MOV BX,7000h
MOV [BX],2000h
6- Transfiera sobre la celda de memoria 6000h el valor 123 y sobre la celda 5000h el
valor 1345h.
INICIO: MOV BX,6000h
MOV [BX],123
MOV BX,5000h
MOV [BX],1345h
7- Transfiera los valores 5 y 3000 sobre los registros AL y DX, y estos a su vez sobre
las celdas de memoria 1000h y 2000h respectivamente.
INICIO: MOV AL,5
MOV DX,3000
MOV BX,1000h
MOV [BX],AL
MOV BX,2000h
MOV [BX],DX
8- Transfiera el contenido de la celda 4800h sobre el registro AL.
INICIO: MOV BX,4800h
MOV AL,[BX]
CIBERTEC CARRERAS PROFESIONALES
22
9- Transfiera el contenido de las celdas 600h y 400h sobre los registros DL y AH
respectivamente.
INICIO: MOV BX,600h
MOV DL,[BX]
MOV BX,400h
MOV AH,[BX]
10- Transfiera el contenido de la celda 100h sobre la celda 200h.
INICIO: MOV BX,100h
MOV AL,[BX]
MOV BX,200h
MOV [BX],AL
11- Transfiera los valores 5, 11 y 18 sobre las celdas de memoria 100h, 200h y 300h
respectivamente.
INICIO: MOV AL,5
BX,100h
MOV [BX],AL
MOV AL,11
BX,200h
MOV [BX],AL
MOV AL,18
BX,300h
MOV [BX],AL
1.3.2 Programas de transferencia y transferencia de control
1- Transfiera sobre el registro CH el valor 100 si el valor del registro CX es igual a 500.
Mientras no se cumpla la condición el valor del registro CH será 0.
INICIO: MOV CH,0
SENSA: CMP CX,500
JE CH100
JMP SENSA
CH100: MOV CH,100
2- Transfiera sobre el registro CH el valor 10 si el valor del registro CX mayor que
1000h. Mientras no se cumpla la condición el valor del registro CH será 0.
INICIO: MOV CH,0
SENSA: CMP CX,1000h
JA CH10
JMP SENSA
CH10: MOV CH,10
3- Transfiera sobre la celda de memoria 5000h el valor 0 si el valor del registro CL es
igual a 200. Mientras no se cumpla la condición el valor de la celda de memoria será
255.
INICIO: MOV BX, 5000h
MOV [BX],255
SENSA: CMP CL,200
JE MEMCERO
JMP SENSA
MEMCERO: MOV [BX],0
CARRERAS PROFESIONALES CIBERTEC
MICROCONTROLADORES
23
4- Transfiera sobre la celda de memoria 300h el valor 1000 si el valor del registro DX
es menor que 10. Mientras no se cumpla la condición el valor de la celda de memoria
será 80.
INICIO: MOV BX, 300h
MOV [BX],80
SENSA: CMP DX,10
JB MEM1000
JMP SENSA
MEM1000: MOV [BX],1000
5- Transfiera los valores 5 y 10 sobre los registros AH y AL respectivamente si el valor
del registro BX es mayor que el valor del registro CX. Mientras no se cumpla la
condición los registros AH y AL serán 0.
INICIO: MOV AH,0
MOV AL,0
SENSA: CMP BX,CX
JA REG5Y10
JMP SENSA
REG5Y10: MOV AH,5
MOV AL,10
6- Transfiera sobre la celda de memoria 4000h el valor 100 si el valor del registro CX
es menor a 1000, pero, si es mayor a 2000 transferirá sobre la misma celda de
memoria el valor 200. Mientras no se cumpla ninguna de las dos condiciones el
contenido de la celda será 0.
INICIO: MOV BX,4000h
MOV [BX],0
SENSA: CMP CX,1000
JB MEM100
CMP CX,2000
JA MEM200
JMP SENSA
MEM100: MOV [BX],100
JMP SENSA
MEM200: MOV [BX],200
JMP SENSA
7- Si el valor del registro DX es menor que el registro CX, transfiera sobre la celda de
memoria 8000h el valor del registro AH. Pero, si el valor del registro DX es mayor o
igual que el registro CX, transfiera sobre la misma celda de memoria el valor del
registro AL.
INICIO: MOV BX,8000h
SENSA: CMP DX,CX
JA MEMAH
CMP DX,CX
JBE MEMAL
JMP SENSA
MEMAH: MOV [BX],AH
JMP SENSA
MEMAL: MOV [BX],AL
JMP SENSA
CIBERTEC CARRERAS PROFESIONALES
24
Resumen
Los Registros se encuentran en el interior del Microprocesador y sirven como
elementos de almacenamiento temporal de información.
El Microprocesador 8086 tiene registros de propósito general, índices, de
segmento y puntero de instrucciones.
Las instrucciones son las órdenes que se almacenan en la memoria, las cuales,
fielmente el Microprocesador interpretará y ejecutara.
El IP (puntero de instrucciones) es el encargado de direccionar las instrucciones
conforme se van ejecutando estas.
Las instrucciones se agrupan en instrucciones de transferencia (copia),
transferencia de control (ruptura de secuencia), aritméticas y lógicas.
Si desea saber más acerca de estos temas, puede consultar las siguientes
páginas.
8 [Link]
Aquí hallará información sobre los registros.
8 [Link]
Aquí hallará información sobre las instrucciones.
CARRERAS PROFESIONALES CIBERTEC
MICROCONTROLADORES
25
UNIDAD DE
APRENDIZAJE
2
SEMANA
EL PIC16F84
LOGRO DE LA UNIDAD DE APRENDIZAJE
Al terminar la unidad, los alumnos describirán las capacidades y funciones del
Microcontrolador PIC16F84. La descripción será escrita y no excederá los 30
minutos.
TEMARIO
Introducción a los Microcontroladores
El PIC16F84
Puesta en marcha
Arquitectura interna
ACTIVIDADES PROPUESTAS
Los alumnos destacan las aplicaciones de los Microcontroladores.
Los alumnos describen las características del PIC16F84.
Los alumnos reconocen la función de las señales de inicialización.
Los alumnos distinguen las unidades internas del PIC16F84.
CIBERTEC CARRERAS PROFESIONALES
26
1. INTRODUCCION A LOS MICROCONTROLADORES
En 1976, Intel y Motorola dos fabricantes de
Microprocesadores lanzan al mercado las primeras
microcomputadoras de un solo chip, las que más tarde
se denominarían Microcontroladores. Estos fueron el
8048 de Intel y el 6805R2 de Motorola. A partir de esta
fecha se marco la ruptura tecnológica de los
Microprocesadores y Microcontroladores, los sistemas
informáticos que manejan grandes volúmenes de información y los sistemas mínimos
que manejan pocas cantidades de información pero que requieren de una gran
interacción con el mundo físico en tiempo real.
Los Microcontroladores se encuentran presentes en cualquier
aplicación que requiera funciones de secuenciamiento,
codificación, decodificación, monitoreo, adquisición de datos,
señalización, procesamiento de señales, control retroalimentado,
temporización, cálculos aritméticos sencillos, comunicaciones,
automatismo, despliegue digital, control on - off, etc. Las
aplicaciones en nuestra realidad se pueden observar en los
artefactos domésticos, automatización industrial, domótica,
industria automotriz, navegación, periféricos de computadora, robótica, sistemas de
seguridad, telefonía celular, etc.
1.1 Diferencia entre Microprocesador y Microcontrolador
Los Microcontroladores difieren de los Microprocesadores por su funcionalidad. Para
que un Microprocesador pueda funcionar, necesita otros componentes externos como
las memorias e interfaces, sólo así
puede recibir y enviar datos. En
cambio, el Microcontrolador fue
diseñado para ser todo eso en un
solo chip. Ningún otro componente
externo se necesita para su
aplicación, porque todos los
dispositivos necesarios ya se incluyen
en este. Así, el Microcontrolador es
un circuito integrado que incluye en
su interior las tres unidades
funcionales de un computador:
Microprocesador, memoria y
unidades de entrada y salida.
1.2 El PIC16F84
En la actualidad existen varios fabricantes de Microcontroladores, entre los que
destacan: Atmel, Intel, Microchip y Motorola. Nosotros trabajaremos con los
Microcontroladores de Microchip por dos razones básicamente: una por la facilidad
con la que se consigue información referente a sus Microcontroladores y la otra porque
en nuestro medio es fácil y económico adquirir estos PICs.
CARRERAS PROFESIONALES CIBERTEC
MICROCONTROLADORES
27
El PIC16F84 es uno de los tantos tipos de
Microcontroladores que fabrica Microchip. Los hay
desde los más simples hasta los más complejos,
clasificados en tres grupos: gama baja, media y
alta. El PIC16F84 pertenece a la gama media, es
decir, es un Microcontrolador de mediana
complejidad, ideal para adentrarnos en el mundo
estos chips.
1.2.1 Descripción del PIC16F84
La figura de la derecha muestra la
disposición de pines de este PIC. VDD
y VSS son los pines de polarización,
+5V y GND respectivamente. OSC1 y
OSC2 son los pines para el reloj, en
estos se conectará el cristal. MCLR es
el pin de programación o reset,
durante la programación esta patilla
se conecta al voltaje de programación
(13,2V), mientras que, en
funcionamiento este debe conectarse
a un arreglo RC para recibir el pulso de inicialización. Los pines RAx y RBx son los
pines de los puertos A y B respectivamente, a través de estas patillas el
microcontrolador se conectará con el circuito a controlar.
[Link] Descripción de la CPU
Este Microcontrolador posee en su interior un Microprocesador de 8 bits que opera a
una frecuencia máxima de 20Mhz, soporta un total de 35 instrucciones las que ejecuta
en un ciclo de maquina, excepto las de salto que ejecuta en dos ciclos. Un ciclo de
maquina equivale a 4 periodos de reloj (f/4), donde f es la frecuencia del cristal
utilizado para proveer la señal de reloj.
[Link] Descripción de las memorias
El PIC16F84 posee tres tipos de memorias: flash, eeprom y ram.
[Link].1 Memoria flash
La memoria flash es la memoria de programas destinada para almacenar las
instrucciones, tiene una capacidad de 1024 celdas de 14 bits (1K word), es decir, se
pueden introducir en esta memoria hasta 1024 instrucciones. Esta memoria es la que
recibirá desde el computador los programas desarrollados durante los laboratorios.
Esta memoria puede ser borrada y programada 10 mil de veces. Las instrucciones
depositadas en esta no se perderán ni modificarán aún si pierde la energía de
polarización.
[Link].2 Memoria eeprom
La memoria eeprom es una memoria destinada para el almacenamiento de datos y
variables. Este tipo de memoria al igual que la flash no pierde su información aun si
pierde la energía que lo polariza. Su capacidad es de sólo 64 celdas de 8 bits, es decir,
64 bytes. Esta memoria puede ser regrabada 10 millones de veces.
CIBERTEC CARRERAS PROFESIONALES
28
[Link].3 Memoria ram
La memoria ram es una memoria destinada al almacenamiento de datos, pero a su
vez, en esta se encuentran todos los registros de configuración de todas las funciones
del PIC. Su capacidad es de tan sólo 68 celdas de 8 bits, es decir, 68bytes.
[Link] Descripción de las unidades de entrada y salida
El PIC16F84 dispone de dos puertos denominados PORTA y PORTB. El puerto A esta
formado por 5 pines, mientras que el puerto B por 8 pines. Es decir, 13 patillas a través
de los cuales el Microcontrolador se conectará con las aplicaciones.
Además posee un dispositivo de temporización denominado TIMER0, el cual servirá
para las aplicaciones que requieran controlar el tiempo.
El TIMER0 y el PORTB pueden funcionar bajo la modalidad de interrupción, es decir,
el microprocesador sólo los atenderá cuando estos lo necesiten. Las posibles
interrupciones se pueden generar por un pulso bajo en el pin RB0 del PORTB, el
desbordamiento del TIMER0, la variación del estado de los pines RB4 a RB7 del
PORTB o por la culminación de la escritura de un dato sobre la memoria Eeprom.
1.3 Puesta en marcha
Poner en funcionamiento al Microcontrolador significa polarizarlo, proveerle la señal de
reloj y asegurar el impulso de inicialización básico para que pueda funcionar
1.3.1 Polarización
Este PIC necesita ser energizado con +5V y GND ya sea durante la
programación de su memoria flash o durante su funcionamiento. Las
patillas utilizadas para esto son VDD y VSS, tal como se muestra en la
figura de la derecha. Algunas versiones de estos PICs disponen de 20
patillas, añadiendo dos patillas mas de polarización. Según sea
conveniente se utilizará una u otra patilla de polarización, no es
necesario conectar las dos patillas VDD a +5V, ni tampoco conectar las
dos patillas VSS a GND, basta con adaptar una de las dos.
1.3.2 Reset
Todos los Microcontroladores necesitan recibir un impulso apenas se energizan. Esto
es fundamental para inicializar sus unidades y registros. De no presentarse este
impulso, el Microcontrolador probablemente quedaría bloqueado ejecutando algún
grupo de instrucciones que nada tienen que ver con la ejecución del programa
preparado, ya que, la PC (contador de programa) podría estar apuntando a cualquier
parte de la memoria de programa flash. Este impuso, entre
otras cosas, asegura que el registro PC apunte a la primera
celda de la memoria flash, es decir, el Microcontrolador queda
listo para leer, interpretar y ejecutar su primera instrucción.
Este impulso se logra realizando un arreglo RC sobre la patilla
MCLR, tal como se muestra en la figura de la izquierda.
Valores comunes serían 1K ohmios
para la resistencia y 10 uF para el
condensador. Si durante el funcionamiento del
Microcontrolador ocurriera algún evento no deseado y este
quedase bloqueado o simplemente se requiere reiniciar la
ejecución del programa desde el principio, es necesario
inyectar un nuevo impulso sobre MCLR. Esto se logra
añadiendo un pulsador, tal como se muestra en la figura.
CARRERAS PROFESIONALES CIBERTEC
MICROCONTROLADORES
29
1.3.3 Reloj
La función de reloj, también conocida como sistema de oscilación,
es fundamental para que el Microcontrolador se ponga en marcha,
sin esta señal los Microcontroladores no podrían realizar la más
mínima labor. Estos necesitan los pulsos repetitivos de la señal de
reloj para leer, interpretar y ejecutar las instrucciones almacenadas
en su memoria flash. Los pines destinados para esta función son
OSC1 y OSC2, a estas se le tendrán que adaptar un cristal, un
arreglo RC, o una fuente externa de reloj.
[Link] Modos de oscilación
El PIC16F84 puede trabajar hasta en cuatro modos de oscilación: LP, XT, HS y RC.
[Link].1 Modo LP
Este sistema esta diseñado para que el microcontrolador opere a
frecuencias bajas comprendidas entre los 32Khz y 200Khz. Es
posible adaptar un oscilador cerámico o un oscilador de cristal de
cuarzo. Este debe ser acompañado por dos condensadores cuyos
valores dependen de la frecuencia de trabajo. Los fabricantes
facilitan esta información en tablas de la hoja de datos del PIC.
[Link].2 Modo XT
Este sistema esta diseñado para que el microcontrolador opere a
frecuencias comprendidas entre los 100Khz y 4Mhz. Es posible
adaptar un oscilador cerámico o un oscilador de cristal de cuarzo.
Este debe ser acompañado por dos condensadores cuyos valores
típicos están entre los 15pF y 33pF.
[Link].3 Modo HS
Este sistema esta diseñado para que el microcontrolador opere a
frecuencias comprendidas entre los 4Mhz y 20Mhz. Es posible
adaptar un oscilador cerámico o un oscilador de cristal de cuarzo.
Este debe ser acompañado por dos condensadores y una
resistencia cuyos valores dependen de la frecuencia de trabajo. Los
fabricantes facilitan esta información en tablas de la hoja de datos
del PIC.
[Link].4 Modo RC
Este es un sistema poco preciso pero económico y se realiza
utilizando una resistencia y un condensador. Los valores
recomendaos por los fabricantes para este tipo de oscilador son: 5K
ohmios < R <100K ohmios y C > 20pF.
CIBERTEC CARRERAS PROFESIONALES
30
1.4 Arquitectura interna
El PIC16F84 al igual que los demás Microcontroladores PIC se caracterizan por tener:
Una arquitectura Harvard.
Un procesamiento segmentado (pipeline)
Un procesador tipo RISC
Un formato ortogonal
1.4.1 Arquitectura Harvard
Esta Arquitectura a diferencia de la arquitectura de Von Newman, trabaja con dos
memorias independientes de datos y de instrucciones, a las que se conecta a través
de dos grupos de buses separados. Ambos buses son totalmente independientes y de
diferentes anchos, esto permite que el microprocesador pueda acceder
simultáneamente a la memoria de datos y a la de instrucciones. tal diferencia permite
que las instrucciones se ejecuten en tiempos mucho más cortos.
1.4.2 Procesamiento segmentado o Pipeline
Este procesamiento puede procesar dos instrucciones al mismo tiempo aunque en
diferente fase cada una. Es decir, mientras se está ejecutando una instrucción, se esta
realizando la lectura de la siguiente instrucción. De esta manera, se puede ejecutar
cada instrucción en un ciclo de maquina.
Para los PICs un ciclo de máquina equivale a cuatro ciclos de reloj, todas sus
instrucciones se ejecutan en este periodo a excepción de las instrucciones de salto
que toman dos ciclos de máquina.
1.4.3. Procesador RISC (reduced instruction set computer)
Los procesadores PIC se caracterizan por tener un juego reducido de instrucciones,
esto permite que las instrucciones sean simples y se ejecuten en un solo ciclo de
máquina.
Este PIC soporta 35 instrucciones, las cuales están organizadas por su orientación al
byte, al bit y a las constantes.
1.4.4 Formato ortogonal
El formato ortogonal se refiere a las fuentes y destinos en
el procesamiento de una instrucción. En el caso de los
PICs, cualquier elemento interno puede funcionar como
fuente o destino, evitando las limitaciones de
procesadores antiguos. En la figura de la derecha
observamos esta característica donde la ALU (unidad
aritmética lógica) tiene como fuentes al registro de trabajo
W y los registros o celdas de la memoria de datos, y como
destino podemos observar que puede ser cualquiera de
estos elementos indicados.
CARRERAS PROFESIONALES CIBERTEC
MICROCONTROLADORES
31
Podemos notar en la figura de abajo la arquitectura Harvard del PIC16F84. La
memoria de programas FLASH (que almacena las instrucciones) tiene un bus
conectado directamente sobre el registro de instrucciones y este a su vez se conecta
con el decodificador de instrucciones, con el multiplexor de direcciones o al multiplexor
de entrada para las operaciones aritmético lógicas. En cambio, la memoria RAM y la
memoria EEPROM (que almacenan los datos) comparten otro camino, otro bus, el
cual se conecta al registro FSR de direccionamiento indirecto de memoria RAM, a los
PUERTOS, al TIMER0, al registro de trabajo W o al multiplexor de entrada para las
operaciones aritmético lógicas.
También podemos observar el formato de trabajo ortogonal. La ALU (unidad aritmética
lógica) recibe por una de sus entradas la información proveniente del bus de la
memoria flash o del bus de las memorias ram o eeprom y por su otra entrada recibe la
información proveniente del registro de trabajo W. El resultado de las operaciones es
devuelto sobre el registro de trabajo W, sobre los puertos, sobre el timer0, sobre las
memorias ram o eeprom y sobre algunos registros especiales como el FSR, EEDATA,
EEADR, STATUS y PC.
CIBERTEC CARRERAS PROFESIONALES
32
Resumen
El Microcontrolador es un microcomputador en un solo chip. En este se incluyen
todos los dispositivos y funciones específicas que reducen el tamaño de las
aplicaciones.
Existe una gran variedad de Microcontroladores desde los más simples hasta los
más potentes y complejos.
El PIC16F84 lo desarrolla Microchip y pertenece a la gama media de los
microcontroladores. Tiene un Microprocesador de 8 bits, una memoria FLASH de
1K words, una memoria EEPROM de 64 bytes, una RAM de 68 bytes, dos puertos:
PORTA y PORTB y un temporizador TMR0.
El PIC, para funcionar necesita una señal de reloj, la cual, puede ser del tipo RC,
XT, HS o LP. Además, es necesario realizar un arreglo RC sobre la patilla MCLR
que asegure su inicialización interna.
Su arquitectura es del tipo Harvard (acceso independiente y simultáneo a la
memoria de datos e instrucciones), realiza procesamiento segmentado de las
instrucciones (mientras una se ejecuta la siguiente instrucción se lee), posee un
reducido número de instrucciones (35) y dispone de un formato ortogonal para la
ejecución de las instrucciones aritmético lógicas (todos los elementos internos
pueden ser fuentes o destino).
Si desea saber más acerca de estos temas, puede consultar las siguientes
páginas.
8 [Link]
Aquí hallará información sobre reset y oscilación del PIC.
8 [Link]
Aquí hallará información sobre la arquitectura de este PIC.
8[Link]
option=com_docman&task=cat_view&gid=14&dir=DESC&order=name&Itemid=27&limi
t=5&limitstart=5
Aquí hallará información sobre el reset.
CARRERAS PROFESIONALES CIBERTEC
MICROCONTROLADORES
33
UNIDAD DE
APRENDIZAJE
2
SEMANA
EL PIC16F84
LOGRO DE LA UNIDAD DE APRENDIZAJE
Al terminar la unidad, los alumnos describirán las capacidades y funciones del
Microcontrolador PIC16F84. La descripción será escrita y no excederá los 30
minutos.
TEMARIO
Mapeo de la memoria FLASH
Organización de la memoria RAM
Registros y funciones
ACTIVIDADES PROPUESTAS
Los alumnos describen las funciones relacionadas con la memoria FLASH.
Los alumnos distinguen la estructura y acceso de la memoria RAM.
Los alumnos describen la función de los registros.
CIBERTEC CARRERAS PROFESIONALES
34
1. MAPEO DE LA MEMORIA FLASH
Esta memoria, encargada de proveer las
instrucciones al microprocesador debe ser
adecuadamente tratada, de lo contrario
podríamos cometer errores involuntarios
de programación.
La capacidad física de esta memoria es de
1Kwords, donde cada Word esta formado
por 14 bits. Su direccionamiento va desde
la posición 0000h hasta la 03FFh. Esta
área es conocida como la memoria de
usuario.
El PC (contador de programa) es un
registro que se encarga de direccionar a
cada una de las instrucciones de esta
memoria. Cada vez que el pin MCLR del
microcontrolador recibe un pulso bajo, el
PC se fija automáticamente a 0000h
(vector de reset) garantizando que se
apunte a la primera instrucción del
programa.
Cada vez que se presente alguna interrupción, el valor del PC es guardado en uno de
los 8 niveles de la Pila, para recibir luego y de modo automático la dirección 0004h
(vector de interrupción).
La Pila es un arreglo de registros que sirve para guardar o restaurar los valores del
PC. Cada vez que se presenta una interrupción o se invoca a alguna subrutina (CALL),
el valor del PC es guardado en la Pila, en cambio, cuando se termina la ejecución de
una subrutina de interrupción (RETFIE) o se finaliza la ejecución de una subrutina
común (RETURN o RETLW), el PC recupera de la Pila su valor.
1.1 Organización de la memoria RAM
Esta memoria es fundamental para el tratamiento de los datos y variables que maneja
un programa. En la figura se nota que esta formada por dos partes: Los registros de
funciones especiales (SFR) y los registros de propósito general (GPR).
1.1.1 Registros de funciones especiales (SFR)
Están formados por las primeras posiciones de la memoria y tienen un papel
importante en la función y configuración del Microcontrolador.
1.1.2 Registros de propósito general (GPR)
Están formados por 68 bytes y obviamente sirven para el tratamiento de los datos y
variables del programa. Están direccionados desde la posición 0Ch a 4Fh.
CARRERAS PROFESIONALES CIBERTEC
MICROCONTROLADORES
35
1.1.3 Bancos de Memoria
La RAM esta estructurada por dos bancos de
memoria: El Banco 0 y el Banco 1. Los registros
de funciones especiales y de propósito general se
encuentran ubicados en los dos Bancos.
En las direcciones 00h a 0Bh del Banco 0 y en
las direcciones 80h a 8Bh del Banco 1 están
ubicados los SFR. Algunos de estos registros
como Indirect, STATUS, FSR, se encuentran
tanto en el Banco 0 como en el Banco 1, con el
único propósito de facilitar su acceso.
El espacio de memoria del Banco 1 destinado
para los registros de propósito general no es
asequible, por lo que, si trata de manipular alguno
de estos registros no será posible, este banco
está mapeado sobre el Banco 0.
[Link] Selección de los Bancos
El acceso a los Bancos se realiza a través de la
manipulación del bit 5 (RPO) del registro
STATUS. Si este bit es puesto a cero se logra el
acceso a cualquiera de los registros contenidos
en el Banco 0, mientras que, si fijamos este bit a
uno, accederemos a los registros del Banco 1.
1.2 Registros y funciones
Los registros tienen como siempre un papel muy importante y en el caso de los PICs
su importancia se multiplica porque no son simples almacenes de información, están
encargados de llevar la configuración y habilitación de las funciones que los PICs
poseen. A continuación se muestran dos tablas, la primera con los registros de
funciones especiales del banco 0 y la segunda con los del Banco 1. En cada una se
indica una breve descripción de los registros.
BANCO 0
00h INDF Lee y escribe los datos en Ram en el modo indirecto con FSR
01h TMR0 Temporizador/contador de 8 bits
02h PCL Contador de programa (puntero de instrucciones) parte baja
03h STATUS Indicador de estado de la ALU, selector de los Bancos de Ram
04h FSR Direccionador de las celdas de Ram en el modo indirecto
05h PORTA Puerto de lectura y escritura de 5 bits
06h PORTB Puerto de lectura y escritura de 8 bits
07h
08h EEDATA Lee y escribe los datos en EEPROM
09h EEADR Direccionador de las celdas de EEPROM
0Ah PCLATH Contador de programa parte alta
0Bh INTCON Configurador e indicador de interrupciones
CIBERTEC CARRERAS PROFESIONALES
36
BANCO 1
80h INDF Lee y escribe los datos en Ram en el modo indirecto con FSR
81h OPTION Configurador del TMR0 y habilitador de interrupciones externas
82h PCL Contador de programa (puntero de instrucciones) parte baja
83h STATUS Indicador de estado de la ALU, selector de Banco de Ram
84h FSR Direccionador de las celdas de Ram en el modo indirecto
85h TRISA Configurador del sentido de trabajo de los bits del PORTA
86h TRISB Configurador del sentido de trabajo de los bits del PORTB
87h
88h EECON1 Controlador de la lectura o escritura sobre la EEPROM
89h EECON2 Secuenciador de escritura (55h y AAh) para la EEPROM
8Ah PCLATH Contador de programa parte alta
8Bh INTCON Configurador e indicador de interrupciones
1.2.1 Funciones de los registros
Cada registro tiene una capacidad máxima de 8 bits y cada bit tiene su función
especial, por tal motivo, es necesario desagregar a los registros en función de sus bits
para tener una idea mas completa de su función.
[Link] El registro STATUS
Este es el registro de estado, esta formado por 8 bits y contiene los indicadores de
estado de la ALU, el bit que permite la selección del banco de memoria ram, y los
indicadores de watchdog y power down. Abajo se muestra la disposición de sus bits:
IRP RP1 RP0 T0 PD Z DC C
bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
Los bits IRP y RP1, no están implementados para este microcontrolador.
RP0 : Selector del banco activo de memoria ram.
0: Banco 0
1: Banco 1
TO : Indicador de ocurrencia del watchdog timer
1: Desactivado
0: Activado
PD: Indicador de funcionamiento de power down
1: Desactivado
0: Activado (modo SLEEP)
Z: Indicador de cero
0: Desactivado
1: Activado
DC: Indicador de carry o borrow decimal
0: Desactivado
1: Activado
CARRERAS PROFESIONALES CIBERTEC
MICROCONTROLADORES
37
C: Indicador de carry o borrow octal
0: Desactivado
1: Activado
[Link] El registro OPTION
El registro de opción también esta formado por 8 bits y contiene los bits de control para
la configuración de trabajo del TIMER0 y WATCHDOG, los bits de habilitación de
interrupción externa y del TIMER0 y la habilitación de la función PULL-up para los bits
del PUERTOB. A continuación se muestran sus bits:
RBPU INTDEG T0CS T0SE PSA PS2 PS1 PS0
bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
RBPU: Función pull-up para el PUERTOB
1: Funcion desactivada
0: Funcion activada
INTEDG: Selector del tipo de interrupción externa RBO/INT
1: activa por flanco de subida
0: activa por flanco de bajada
T0CS: Selector de la fuente de reloj para el TIMER0
1: Externa proveniente del pin RA4/TOCKI
0: Interna proveniente del cristal F/4
T0SE: Selector del tipo de flanco externo para el TIMER0
1: Incremento del TIMER por flanco de bajada del pin RA4/TOCKI
0: Incremento del TIMRE por flanco de subida del pin RA4/TOCKI
PSA: Desviador del factor de división de la señal de reloj
1: Hacia la función de WATCHDOG
0: Hacia la función del TIMER
PS2-PS1-PS0: Selectores del factor de división de la señal de reloj
PS2 PS1 PS0 TIMER0 WATCHDOG
0 0 0 2 1
0 0 1 4 2
0 1 0 8 4
0 1 1 16 8
1 0 0 32 16
1 0 1 64 32
1 1 0 128 64
1 1 1 256 128
CIBERTEC CARRERAS PROFESIONALES
38
[Link] El registro INTCON
El registro de interrupción también está formado por 8 bits y contiene los bits de
habilitación para las interrupciones, asi como, los indicadores de la presencia de
interrupción. Enseguida se muestran sus bits:
GIE EEIE T0IE INTE RBIE T0IF INTF RBIF
bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
GIE: Habilitador global de las interrupciones
1: Habilitado
0: Deshabilitado
EEIE: Interrupción por escritura de la EEPROM
1: Habilitado
0: Deshabilitado
T0IE: Interrupción por desbordamiento del TIMER0
1: Habilitado
0: Deshabilitado
INTE: Interrupción externa del pin RB0/INT
1: Habilitado
0: Deshabilitado
RBIE: Interrupción por variación del valor de los bits <RB4:RB7>
1: Habilitado
0: Deshabilitado
T0IF: Indicador de interrupción de desbordamiento del TIMER0
1: Activado
0: Desactivado
INTF: Indicador de interrupción del pin RB0/INT
1: Activado
0: desactiva
RBIF: Indicador de interrupción por variación del valor de los bits <RB4:RB7>
1: Activado
0: Desactivado
[Link] El registro EECON1
El registro de configuración 1 de la memoria EEPROM es de 8 bits y contiene los bits
que permiten la configuración, habilitación y puesta en marcha del proceso de lectura
o escritura de dicha memoria. Abajo se muestran sus bits:
- - - EEIF WRWRR WREN WR RD
bit7 bit6 bit5 bit4 bit3 bit2 bit1 Bit0
EEIF: Indicador de proceso de escritura
1: Escritura culminada
0: Escritura desactivada o en proceso
CARRERAS PROFESIONALES CIBERTEC
MICROCONTROLADORES
39
WRERR: Indicador de error del proceso de escritura
1: Proceso finalizado prematuramente debido a un reset o watchdoog
0: Proceso correcto
WREN: Habilitador del proceso de escritura
1: Habilitado
0: Deshabilitado
WR: Control de inicialización de la escritura e indicador de proceso culminado
1: Inicia el proceso de escritura
0: Indica el fin del proceso de escritura
RD: Control de inicialización de la lectura e indicador de proceso culminado
1: Inicia el proceso de lectura
0: Indica el fin del proceso de lectura
[Link] El registro EECON2
El registro de configuración 2 de la memoria EEPROM es de 8 bits y sólo sirve para
secuenciar la operación de escritura sobre esta memoria. Este registro debe recibir
consecutivamente dos valores, primero se le debe transferir el valor 55h y luego el
valor AAh. Realizado esto, ya se puede iniciar el proceso de escritura sobre la
EEPROM.
[Link] El registro PORTA
El registro de puerto A esta formado por 5 bits y contiene los 5 primeros pines de
comunicación con los elementos externos al Microcontrolador. Veamos sus bits:
- - - RA4/TOCKI RA3 RA2 RA1 RA0
bit7 bit6 bit5 bit4 bit3 bit2 bit1 Bit0
RA0: Bit menos significativo del puerto. Funciona como I/O digital.
RA1: Funciona como I/O digital.
RA2: Funciona como I/O digital.
RA3: Funciona como I/O digital.
RA4: Bit mas significativo del puerto. Funciona como I/O digital o como entrada de
fuente externa de reloj para el TMR0.
[Link] El registro PORTB
El registro de puerto B esta formado por 8 bits y contiene los 8 siguientes pines de
comunicación con los elementos externos al Microcontrolador. Veamos sus bits:
RB7 RB6 RB5 RB4 RB3 RB2 RB1 RB0/INT
bit7 bit6 bit5 bit4 bit3 bit2 Bit1 Bit0
RB0: Bit menos significativo. Funciona como I/O digital o interrupción por pulso bajo.
RB1: Funciona como I/O digital.
RB2: Funciona como I/O digital.
RB3: Funciona como I/O digital.
RB4: Funciona como I/O digital o interrupción si varía su valor.
RB5 Funciona como I/O digital o interrupción si varía su valor.
RB6 Funciona como I/O digital o interrupción si varía su valor.
RB7 Bit mas significativo. Funciona como I/O o interrupción si varía su valor.
CIBERTEC CARRERAS PROFESIONALES
40
[Link] El registro TRISA
El registro de configuración del sentido de trabajo está formado por 5 bits y establece
si cada pin del PUERTO A trabajará como entrada o salida. Veamos sus bits:
- - - TRISA4 TRISA3 TRISA2 TRISA1 TRISA0
bit7 bit6 bit5 bit4 bit3 bit2 bit1 Bit0
TRISA0: Bit de configuración del pin RA0.
TRISA1: Bit de configuración del pin RA1.
TRISA2: Bit de configuración del pin RA2.
TRISA3: Bit de configuración del pin RA3.
TRISA4: Bit de configuración del pin RA4.
Cada bit puede ser configurado independientemente o en grupo según se requiera. Si
el bit TRISAx es fijado a cero (0), su pin correspondiente en el PORTA RAx queda
configurado como salida. Por el contrario, si fijamos su valor a uno (1) el pin
correspondiente en RAx quedaría configurado como entrada.
[Link] El registro TRISB
El registro de configuración del sentido de trabajo está formado por 8 bits y establece
si cada pin del PUERTO B trabajará como entrada o salida. Veamos sus bits:
TRISB7 TRISB6 TRISB5 TRISB4 TRISB3 TRISB2 TRISB1 TRISB0
bit7 bit6 bit5 bit4 bit3 bit2 bit1 Bit0
TRISB0: Bit de configuración del pin RB0.
TRISB1: Bit de configuración del pin RB1.
TRISB2: Bit de configuración del pin RB2.
TRISB3: Bit de configuración del pin RB3.
TRISB4: Bit de configuración del pin RB4.
TRISB5: Bit de configuración del pin RB5.
TRISB6: Bit de configuración del pin RB6.
TRISB7: Bit de configuración del pin RB7.
Cada bit puede ser configurado independientemente o en grupo según se requiera. Si
el bit TRISBx es fijado a cero (0), su pin correspondiente en el PORTB RBx queda
configurado como salida. Por el contrario, si fijamos su valor a uno (1) el pin
correspondiente en RBx quedaría configurado como entrada.
CARRERAS PROFESIONALES CIBERTEC
MICROCONTROLADORES
41
Resumen
La memoria FLASH sirve para almacenar las instrucciones del programa. En esta
se insertan las del programa principal y las de las subrutinas de interrupción. El
registro encargado de direccionar estas instrucciones es el PC. Cada vez que
aparece un reset el PC recibe la dirección 0000h para ejecutar la primera
instrucción.
La memoria RAM está organizada por dos Bancos, el Banco 0 y el Banco 1. En los
primeros espacios de memoria están contenidos los registros especiales de
configuración y función del PIC. Mientras que, los demás espacios están
reservados para el tratamiento de los datos y variables.
La selección de los Bancos se debe realizar cada vez que necesitamos manipular
algún registro especial o leer/escribir sobre alguna de las celdas de RAM. Esta
selección se realiza a través del bit RP0 del registro STATUS.
Los registros de puertos PORTA y PORTB son los encargados de comunicarse con
los dispositivos externos, mientras que, los registros TRISA y TRISB son los
encargados de configurar el sentido de trabajo de los puertos.
Si desea saber más acerca de estos temas, puede consultar las siguientes
páginas.
8 [Link]
Aquí hallará información sobre la organización de la memoria del PIC.
8 [Link]
Aquí hallará información sobre los registros de este PIC.
CIBERTEC CARRERAS PROFESIONALES
42
UNIDAD DE
APRENDIZAJE
3
SEMANA
PROGRAMACIÓN DEL PIC16F84
LOGRO DE LA UNIDAD DE APRENDIZAJE
Al terminar la unidad, los alumnos podrán implementar circuitos aplicativos
basados en el PIC16F84. La polarización, reset, oscilación y los dispositivos de
salida se adaptarán al microcontrolador sin ningún tipo de fallas.
Al terminar la unidad, los alumnos podrán desarrollar programas que pongan en
marcha el funcionamiento de circuitos aplicativos basados en el PIC16F84. Los
programas se realizarán en el computador, se transferirán al microcontrolador y
dejarán operativos al 100% la configuración y por lo menos al 80% la función
propuesta para la aplicación.
TEMARIO
Juego de instrucciones
Acceso a los puertos
Desarrollo de programas
ACTIVIDADES PROPUESTAS
Los alumnos conectan los dispositivos al PIC.
Los alumnos configuran el sentido de trabajo de los puertos.
Los alumnos leen y escriben información sobre los puertos.
CARRERAS PROFESIONALES CIBERTEC
MICROCONTROLADORES
43
1. JUEGO DE INSTRUCCIONES
Las instrucciones, en cualquier sistema basado en Microcontrolador o
Microprocesador, permiten llevar a cabo todas las tareas y funciones propuestas para
una aplicación. Es importante identificar sus funciones individuales y más aún
interrelacionarlas para crear los programas. El PIC16F84 soporta 35 instrucciones y a
continuación se describen brevemente según su orientación:
La letra d indica el destino de la operación, si d = 0 el destino de la
Orientadas al BYTE operación es el registro de trabajo W, pero si d = 1 el destino será el
elemento F (registro especial, celda de ram o variable).
ADDWF F,d Suma el registro W y el elemento F
ANDWF F,d And lógico entre W y F
CLRF F Borra todos los bits de F
CLRW Borra todos los bits de W
COMF F,d Complementa el valor de F
DECF F,d Disminuye en uno el valor de F
DECFSZ F,d Disminuye en uno el valor de F y salta si se hizo cero
INCF F,d Aumenta en uno el valor de F
INCFSZ F,d Aumenta en uno el valor de F y salta si se hizo cero
IORWF F,d Or lógico entre W y F
MOVFW F Transfiere el valor de F a W
MOVWF F Transfiere el valor del registro W a F
NOP Ninguna operación, sólo consume un ciclo de máquina
RLF F,d Rota hacia la izquierda un bit F a través del Carry
RRF F,d Rota hacia la derecha un bit F a través del Carry
SUBWF F,d Resta el registro W y F
SWAPF F,d Intercambia los nibbles de F
XORWF F,d Xor lógico entre W y F
Ejemplos:
ADDWF PORTB,1 ; PORTB = W + PORTB
ADDWF PORTB,0 ; W = W + PORTB
CLRF PORTA ; PORTA = 0 (todos sus bits)
CLRF TRISB ; TRISB = 0 (todos sus bits)
CLRW ; W = 0 (todos sus bits)
DECF VALOR ; VALOR = VALOR – 1
INCF VARIABLE ; VARIABLE = VARIABLE + 1
MOVFW PORTB ; W = PORTB
MOVWF INDF ; INDF = W
SUBWF MAXIMO,1 ; MAXIMO = MAXIMO – W
SUBWF MAXIMO,0 ; W = MAXIMO - W
CIBERTEC CARRERAS PROFESIONALES
44
La letra b indica el bit a manipular del elemento F (registro especial,
celda de ram o variable). Si el bit tiene nombre se colocará su
Orientadas al BIT
nombre en la posición b, de lo contrario, tendrá que indicarse la
posición que ocupa el bit dentro del elemento F.
BCF F,b Pone a cero (0) el bit b del elemento F
BSF F,b Pone a uno (1) el bit b del elemento F
BTFSC F,b Salta si el bit b de F está en cero
BTFSS F,b Salta si el bit b de F está en uno
Ejemplos:
BCF STATUS,RP0 ; Pone a cero (0) el bit RP0 del registro STATUS
BSF PORTA,0; Pone a uno (1) el bit menos significativo del PUERTO A.
BCF TRISA,2 ; Pone a cero el tercer bit del registro TRISA.
BSF EECON1,7 ; Pone a uno el bit mas significativo del registro EECON1.
BTFSC PORTB,0 ; Salta si el bit menos significativo del PUERTO B es cero.
BTFSS PORTA,4 ; Salta si el bit mas significativo del PUERTO A es uno.
La letra K es el operando constante que puede tomar cualquier valor
numérico o literal comprendido entre 0 y 255, este valor puede ser
Constantes y control
expresado en decimal, hexadecimal o binario. El destino de todas
las operaciones donde interviene K es el registro W.
ADDLW K Suma W mas K
ANDLW K AND lógica entre W y K
CALL ETIQUETA Se llama a ejecución la subrutina cuya dirección lo indica ETIQUETA
CLRWDT Borra el temporizado de la función watchdog
GOTO K Salta a la dirección indicada en la ETIQUETA
IORLW K OR lógico entre W y K
MOVLW K Transfiere a W el valor de K
RETFIE Retorno de una subrutina de interrupción.
RETLW K Retorno de una subrutina común cargando una constante en W
RETURN Retorno de una subrutina común
SLEEP Ingreso al modo de descanso
SUBLW K Resta K menos W
XORLW K Xor lógico entre W y K
Ejemplos:
ADDLW .100 ; W = W + 100 (decimal)
ADDLW 0X35 ; W = W + 35h (hexadecimal)
ADDLW B’11110001’ ; W = W + 11110001b (binario)
ANDLW B’11001100’ ; W = W . 11001100b
CALL DELAY ; Invoca la ejecución de la función DELAY.
GOTO REPEAT ; Salta a la etiqueta REPEAT
MOVLW 0X55 ; W = 55h
RETLW .10 ; Retorna de una subrutina y transfiere el valor 10 a W
RETLW 0x58 ; Retorna de una subrutina y transfiere el valor 58h a W
SUBLW .200 ; W = 200 – W
CARRERAS PROFESIONALES CIBERTEC
MICROCONTROLADORES
45
1.1 Acceso a los puertos
Sabemos que se dispone de los puertos A y B para comunicar al PIC con cualquier
elemento externo y no es suficiente conectar los dispositivos a estos puertos para que
empiecen a funcionar.
1.1.1 Configuración de los puertos
Es necesario indicarle al Microcontrolador el sentido de trabajo de los elementos que
hemos conectado a sus puertos, de no hacerlo, en el mejor de los casos nuestro
sistema no funcionaría bien y en el peor de los casos quemaríamos algunos bits de los
puertos.
[Link] Entradas o salidas
Cada pin de los puertos es configurable independientemente y sólo puede trabajar en
un solo sentido, como entrada o salida. La configuración se realiza a través de los
registros TRISA y TRISB, donde TRISA configura al PUERTO A y TRISB configura al
PUERTO B. Un cero sobre los bits de los registros TRIS configura como salida los
pines relacionados en los PUERTOS, mientras que, un uno deja configurado como
entrada los pines relacionados en los PUERTOS.
[Link] Ejemplos de configuración
Considere que Al puerto A se ha conectado leds y switches según el siguiente
esquema:
El registro de configuración a manipular sería TRISA y sus bits deberían verse según
el esquema:
Para lograr esto, utilizamos las siguientes instrucciones:
BCF TRISA,0 ;OUT (LED)
BCF TRISA,1 ;OUT (LED)
BSF TRISA,2 ;IN (SWITCH)
BCF TRISA,3 ;OUT (LED)
BSF TRISA,4 ;IN (SWITCH)
O si se quiere, en dos instrucciones:
MOVLW B’00010100’
MOVWF TRISA
Supongamos ahora que al PUERTO B se le ha conectado lo un relé, leds, un switch,
un sensor óptico y un pulsador según el siguiente esquema:
El registro de configuración a manipular sería TRISB y sus bits deberían verse según
el esquema:
CIBERTEC CARRERAS PROFESIONALES
46
Para lograr esto, utilizamos las siguientes instrucciones:
BSF TRISB,0 ;IN (PULSADOR)
BCF TRISB,1 ;OUT (LED)
BCF TRISB,2 ;OUT (LED)
BCF TRISB,3 ;OUT (LED)
BSF TRISB,4 ;IN (SENSOR)
BSF TRISB,5 ;IN (SWITCH)
BCF TRISB,6 ;OUT (LED)
BSF TRISB,7 ;IN (RELE)
Si deseamos hacer lo mismo en dos instrucciones:
MOVLW B’10110001’
MOVWF TRISB
1.1.4 Selección de los bancos
Antes de manipular los bits de cualquier registro debemos de asegurarnos que nos
encontramos en el banco al que pertenece este registro y para ello debemos
seleccionar el Banco adecuado utilizando el bit RP0 del registro STATUS.
Recordemos que si este bit recibe 0 seleccionamos el Banco 0, de lo contrario, si este
bit recibe un uno, estaríamos seleccionando el Banco 1.
Las instrucciones relacionadas serían:
BCF STATUS,RP0 ;Selecciona el Banco 0
BSF STATUS,RP0 ;Selecciona el Banco 1
Recordemos que los registros de configuración TRISA y TRISB se encuentran
ubicados en el Banco 1, por lo tanto, la configuración adecuada para los dos casos
anteriores de conexión serían:
Para la configuración del PUERTO A:
BSF STATUS,RP0 ;Selección del Banco 1
BCF TRISA,0 ;OUT (LED)
BCF TRISA,1 ;OUT (LED)
BSF TRISA,2 ;IN (SWITCH)
BCF TRISA,3 ;OUT (LED)
BSF TRISA,4 ;IN (SWITCH)
Para la configuración del PUERTO B:
BSF STATUS,RP0 ;Selección del Banco 1
BSF TRISB,0 ;IN (PULSADOR)
BCF TRISB,1 ;OUT (LED)
BCF TRISB,2 ;OUT (LED)
BCF TRISB,3 ;OUT (LED)
BSF TRISB,4 ;IN (SENSOR)
BSF TRISB,5 ;IN (SWITCH)
BCF TRISB,6 ;OUT (LED)
BSF TRISB,7 ;IN (RELE)
CARRERAS PROFESIONALES CIBERTEC
MICROCONTROLADORES
47
1.1.2 Lectura y escritura de los puertos
Llegado a este punto estamos listos para comunicar (manipular) al Microcontrolador
con los dispositivos externos.
[Link] Lectura
Leer significa obtener información de los puertos, es decir saber en que estado se
encuentran los dispositivos de entrada y para esto disponemos de dos tipos de
instrucción, la que está orientada al byte (MOVFW) y las que están orientadas al BIT
(BTFSC y BTFSS). Si se desea capturar la información de varios bits de un puerto al
mismo tiempo, será necesario utilizar MOVFW, pero, si se desea saber el estado de un
solo bit, conviene utilizar BTFSC o BTFSS según sea el estado que deseamos
averiguar.
Si tuviésemos un teclado conectado al Microcontrolador, tal
como se muestra en el esquema de la derecha, sería
necesario utilizar la instrucción MOVFW F, porque el teclado
tiene varios bits.
Cada vez que necesitemos leer el teclado utilizaríamos
MOVFW PORTB, con lo cual, la información obtenida del
teclado se transferiría sobre el registro de trabajo W. Que
hacer con la información obtenida del teclado, dependerá de
la aplicación planteada, lo cual, obviamente involucrará la manipulación del registro W,
ya que, este registro es el que recibe la información.
Si tuviéramos un pulsador, switch o sensor óptico conectado a
alguna de las entradas de los ports y querríamos averiguar en que
estado se encuentra este, estaríamos obligados a utilizar las
instrucciones BTFSC o BTFSS. Si se requiere saber que el pulsador
está en 0 usaremos la instrucción, para este caso, BTFSC PORTA,2.
Pero, si es requerido saber que este pulsador se encuentra en 1,
utilizaremos la instrucción BTFSS PORTA,2. Que hacer si el pulsador estuvo en cero o
uno, dependerá nuevamente de las condiciones de la aplicación implementada.
Recordemos que los puertos se encuentran ubicados en el Banco 0 de la memoria
RAM y por lo tanto, es necesario seleccionar el Banco 0 antes de manipular algún bit
de los puertos.
Las instrucciones incluida la selección del Banco sería:
BCF STATUS,RP0 ;Selección del Banco 0
MOVFW PORTB ;W = PORTB = TECLADO
BCF STATUS,RP0 ;Selección del Banco 0
BTFSC PORTA,2 ;Salta si RA2 es 0
[Link] Escritura
Escribir significa enviar información hacia los puertos, es decir fijar a 0 ó 1 los bits de
los dispositivos de salida y para esto disponemos de dos tipos de instrucción, la que
está orientada al byte (MOVWF) y las que están orientadas al BIT (BCF y BSF). Si se
desea fijar el estado de varios bits de un puerto al mismo tiempo, será necesario
utilizar MOVWF, pero, si se desea manipular el estado de un solo bit, conviene utilizar
BCF o BSF según sea el estado que deseamos fijar.
CIBERTEC CARRERAS PROFESIONALES
48
Si tenemos un display de 7 segmentos conectado uno de los
puertos, sería necesario manipular varios bits al mismo tiempo y
por lo tanto, la instrucción conveniente sería MOVWF F.
Supóngase que se desea apagar el display cátodo común, es
decir, sus segmentos se apagan con ceros; las instrucciones a
usar serían: MOVLW B’00000000’ y MOVWF PORTB.
Pero, si en lugar de displays se tiene leds conectados a los puertos,
tal como se muestra en la figura de la derecha, las instrucciones a
utilizar serían BCF y BSF según se requiera. Suponiendo que los
leds se encuentran en conexión normal, es decir, se apagan con 0 y
se encienden con 1. ¿Cuales serían las instrucciones para apagar el
led conectado al puerto A y encender el que está conectado al
puerto B?. Las instrucciones serían: BCF PORTA,3 y BSF PORTB,4
respectivamente.
Pero, nuevamente cualquier manipulación de los puertos no será posible si no
seleccionamos el Banco de memoria que los contiene. Por lo tanto, las instrucciones
incluido la selección de los Bancos se vería así:
BCF STATUS,RP0 ;Selección del Banco 0
MOVLW B’00000000’ ;W = 00000000b
MOVWF PORTB ;DISPLAY = PORTB = W
BCF STATUS,RP0 ;Selección del Banco 0
BCF PORTA,3 ;LED = RA3 = 0
BSF PORTB,4 ;LED = RB4 = 1
Si tuviera el siguiente esquema y le pidieran transferir
constantemente la información del teclado sobre el display, la
instrucción de lectura sería MOVFW F y la de escritura sería
MOVWF F.
Específicamente las instrucciones serían MOVFW PORTB y
MOVWF PORTA.
Tenga en cuenta que no se selecciona el banco 0 a cada instante que necesitemos
manipular los puertos ya sea para leer o escribir en estos. Sólo se realiza la selección,
si el banco de trabajo actual no fuera el deseado.
1.2 Desarrollo de programas
A continuación se propondrán aplicaciones básicas de escritura y lectura de puertos.
Se plantearán circuitos y en base a estos y las condiciones propuestas,
desarrollaremos los programas:
1.2.1 Escritura sobre cuatro leds
Realice el programa que encienda los leds L1 y L3, y apague los
leds L2 y L4.
Como los leds se encuentran en conexión normal, se apagarán
recibiendo un 0 sobre el pin de conexión y se encenderán
recibiendo un 1 sobre el pin conectado.
Pero, antes de lanzarnos con la ejecución de las instrucciones que
enciendan y apaguen los leds, debemos recordar la configuración
de trabajo del puerto B, es decir, el sentido. Como sólo tiene
CARRERAS PROFESIONALES CIBERTEC
MICROCONTROLADORES
49
conectado leds, estas cuatro patillas deben trabajar como salidas, lo cual debemos
realizar utilizando el registro TRISB.
Empecemos con la configuración, para esto debemos seleccionar el Banco 1 de RAM
porque en este se encuentra el registro TRISB:
INICIO: BSF STATUS,RP0 ; Selección del Banco 1
BCF TRISB,0 ; OUT PORTB, O
BCF TRISB,1 ; OUT PORTB,1
BCF TRISB,2 ; OUT PORTB,2
BCF TRISB,3 ; OUT PORTB,3
Culminada la configuración, podríamos encender y apagar los leds según lo requerido.
Pero, proceder con esto significa manipular el PUERT B y este pertenece al Banco 0
de la RAM. Por lo tanto, antes tendríamos que seleccionar el Banco 0.
BCF STATUS,RP0 ; Selección del Banco 0
BSF PORTB,0 ; L1 ENCENDIDO
BSF PORTB,2 ; L3 ENCENDIDO
BCF PORTB,1 ; L2 APAGADO
BCF PORTB,3 ; L4 APAGADO
Con esto habríamos terminado el programa, pero, para evitar que el microprocesador
siga buscando instrucciones en la memoria flash, lo detendremos forzándolo a ejecutar
siempre la misma instrucción:
STOP: GOTO STOP ; Salta a la etiqueta STOP
Finalmente, el programa ordenado seria:
INICIO: BSF STATUS,RP0 ; Selección del Banco 1
BCF TRISB,0 ; OUT PORTB, O
BCF TRISB,1 ; OUT PORTB,1
BCF TRISB,2 ; OUT PORTB,2
BCF TRISB,3 ; OUT PORTB,3
BCF STATUS,RP0 ; Selección del Banco 0
BSF PORTB,0 ; L1 ENCENDIDO
BSF PORTB,2 ; L3 ENCENDIDO
BCF PORTB,1 ; L2 APAGADO
BCF PORTB,3 ; L4 APAGADO
STOP: GOTO STOP ; Salta a la etiqueta STOP
1.2.2 Manipulación de un led y un pulsador
Realice el programa que mantenga apagado el led hasta que se active el pulsador. Es
decir, el led permanecerá apagado y se encenderá apenas se
active el pulsador.
Como el led está en conexión normal, se apagará con 0 y se
encenderá con 1.
Según el arreglo del pulsador, cuando este no esta activado la
patilla RA0 (PORTA,0) está conectada a tierra a través de la
resistencia, es decir, el pulsador en estado natural genera un 0
sobre el pin RA0. Y cuando se active el pulsador, el pin RA0 queda
conectado a 5v. Es decir, en estado activado, el pulsador genera
un 1 sobre la patilla RA0.
CIBERTEC CARRERAS PROFESIONALES
50
Recordemos por última vez que, antes de manipular los puertos, estos deben ser
configurados a través del los registros TRIS.
Configuración:
INICIO: BSF STATUS,RP0 ; Selección del Banco 1
BCF TRISB,0 ; OUT PORTB,0
BSF TRISA,0 ; IN PORTA,0
Manipulación de los puertos:
BCF STATUS,RP0 ; Selección del Banco 0
BCF PORTB,0 ; LED APAGADO
SENSA: BTFSS PORTA,0 ; Salta a PON si el pulsador se activa
GOTO SENSA ; Salta a la etiqueta SENSA
PON: BSF PORTB,0 ; LED ENCENDIDO
STOP: GOTO STOP ;
1.2.3 Manipulación de un led y dos pulsadores
Realice el programa que permita encender el led cada vez que se
active el pulsador P1 y apagar el led cada vez que se active el
pulsador P2. El led debe empezar apagado.
El led está en conexión contraria, por lo tanto, se encenderá con un
0 y se apagará con un 1.
Los pulsadores tienen la misma conexión que el pulsador del
problema anterior, por lo tanto, mientras no se activan generan un
0 sobre su pines y generan un 1 sobre sus patillas cada vez que se
activen.
Cuando son varios los pulsadores que se evaluarán en un programa, conviene sensar
su estado OFF.
Desarrollemos el programa:
INICIO: BSF STATUS,RP0 ; Selección del Banco 1
BCF TRISB,0 ; OUT PORTB,0
BSF TRISA,0 ; IN PORTA,0 (P1)
BSF TRISA,1 ; IN PORTA,1 (P2)
BCF STATUS,RP0 ; Selección del Banco 0
BSF PORTB,0 ; LED APAGADO
SENSA1 BTFSC PORTA,0 ; Salta a SENSA2 si P1 está desactivado
GOTO P1ON ; Salta a P1ON
SENSA2 BTFSC PORTA,1 ; Salta a P1P2OFF si P2 está desactivado
GOTO P2ON ; Salta a P2ON
P1P2OFF GOTO SENSA1 ; Salta a SENSA1
P1ON BCF PORTB,0 ; LED ENCENDIDO
GOTO SENSA1 ; Salta a SENSA1
P2ON BSF PORTB,0 ; LED APAGADO
GOTO SENSA1 ; Salta a SENSA1
En este caso no es necesario añadir un bloqueo al final del programa, ya que este es
un programa repetitivo. Siempre regresa sobre la etiqueta SENSA1, porque la
condición del problema es cada vez que se activen los pulsadores y en dicha etiqueta
se inicia la evaluación de los pulsadores.
CARRERAS PROFESIONALES CIBERTEC
MICROCONTROLADORES
51
1.2.4 Escritura sobre un display
Realice el programa que muestre sobre el display el número 7.
Tenga en cuenta que el display es cátodo común, es decir, sus
segmentos se encienden con unos (1) y
se apagan con ceros (0). Además la
conexión de cada uno de sus segmentos
al puerto B se muestra en la figura de la
derecha. Según esta adaptación el bit
PORTB,0 estaría conectado al segmento a del display, el bit PORTB1 al regento b y
así sucesivamente. Con ello podemos armar una tabla que relacione los números del 0
al 9 sobre el display con los valores que se deben transferir sobre el PORTB. Para
este problema sólo es necesario el número 7, veamos que valor se debe enviar por el
PORTB para que aparezca el número requerido.
Segmentos p g f e d c b a
0 = OFF
Bits del PORTB 7 6 5 4 3 2 1 0
1 = ON
Número 7 0 0 0 0 0 1 1 1
El número 7 necesita encender los segmentos a, b y c (1) del display, los demás
segmentos deben apagarse (0).
Iniciemos el programa configurando todo el PORTB como salida:
INICIO: BSF STATUS,RP0 ; Selección del Banco 1
MOVLW B’00000000’ ; W = 00000000b
MOVWF TRISB ; TRISB = W (OUT PORTB)
BCF STATUS,RP0 ; Selección del Banco 0
MOVLW B’00000111’ ; W = 00000111b (Número 7)
MOVWF PORTB ; DISPLAY = 7
STOP: GOTO STOP ;
1.2.5 Manipulación de un display y dos pulsadores
Realice el programa que muestre sobre el display el número 0
cada vez que se active el pulsador P1 y cada vez que se active
P2 muestre el número 9. Tenga en
cuenta que la conexión al PORTB es
la misma que la conexión del problema
anterior, pero, el tipo de display ya no
es cátodo común, sino ánodo común,
eso quiere decir que, sus segmentos se encienden con ceros (0)
y se apagan con unos (1). Los pulsadores, según su arreglo,
generan los mismos cambios que en los problemas anteriores: 0 para OFF y 1 para
ON. Apenas inicie el programa el display debe tener apagado todos sus segmentos.
Armemos la tabla para los números 0 y 9:
Segmentos p g f e d c b a
Bits del PORTB 7 6 5 4 3 2 1 0 1 = OFF
Número 0 1 1 0 0 0 0 0 0 0 = ON
Número 9 1 0 0 1 0 0 0 0
Cuando son varios los pulsadores que se evaluarán en un programa, conviene sensar
su estado OFF.
CIBERTEC CARRERAS PROFESIONALES
52
Iniciemos el programa configurando todo el PORTB como salida y los bits PORTA,2 y
PORTA,3 como entradas:
INICIO: BSF STATUS,RP0 ; Selección del Banco 1
MOVLW B’00000000’ ; W = 00000000b
MOVWF TRISB ; OUT PORTB
BSF TRISA,2 ; IN PORTA,2 (P1)
BSF TRISA,3 ; IN PORTA,3 (P2)
BCF STATUS,RP0 ; Selección del Banco 0
MOVLW B’11111111’ ; W = 11111111b
MOVWF PORTB ; DISPLAY APAGADO
SENSA1 BTFSC PORTA,2 ; Salta a SENSA2 si P1 está desactivado
GOTO P1ON ; Salta a P1ON
SENSA2 BTFSC PORTA,3 ; Salta a P1P2OFF si P2 está desactivado
GOTO P2ON ; Salta a P2ON
P1P2OFF GOTO SENSA1 ; Salta a SENSA1
P1ON MOVLW B’11000000’ ; W = 11000000b (Número 0)
MOVWF PORTB ; DISIPLAY = 0
GOTO SENSA1 ; Salta a SENSA1
P2ON MOVLW B’10010000’ ; W = 10010000b (Número 9)
MOVWF PORTB ; DISPLAY = 9
GOTO SENSA1 ; Salta a SENSA1
CARRERAS PROFESIONALES CIBERTEC
MICROCONTROLADORES
53
Resumen
El PIC16F84 soporta 35 instrucciones y están organizadas en tres grupos: las
orientadas al byte, orientadas al bit y las literales y control.
Las instrucciones orientadas al bytes permiten transferir datos de 8 bits entre las
memorias y los registros. Las instrucciones orientadas al bit permiten manipular
selectivamente el estado de un bit de las celdas de memoria o registros y también
permiten averiguar en que estado se encuentra un bit. Las instrucciones literales
permiten operaciones entre el registro W y cualquier constante de 8 bits.
El acceso a los puertos (PORTA y PORTB) inicia con su configuración a través de
los registros TRISA y TRISB. Un cero sobre los bits de los registros TRIS configura
como salida a los bits relacionados en los POTS y un uno sobre los registros TRIS
configura como salida sus bits asociados en los PORTS.
Los puertos (A y B) se encuentran ubicados en el Banco 0 de RAM , mientras que,
los registros de configuración TRIS, se encuentran ubicados en el Banco 1. El
Banco 0 se selecciona fijando a 0 el bit RP0 del registro STATUS, mientras que, el
Banco 1 se habilita colocando un 1 sobre el bit RP0.
Si desea saber más acerca de estos temas, puede consultar las siguientes
páginas.
8 [Link]
Aquí hallará información sobre la configuración de los puertos.
8 [Link]
Aquí hallará programas que manipulan los puertos.
CIBERTEC CARRERAS PROFESIONALES
54
UNIDAD DE
APRENDIZAJE
3
SEMANA
PROGRAMACIÓN DEL PIC16F84
LOGRO DE LA UNIDAD DE APRENDIZAJE
Al terminar la unidad, los alumnos podrán implementar circuitos aplicativos
basados en el PIC16F84. La polarización, reset, oscilación y los dispositivos de
salida se adaptarán al microcontrolador sin ningún tipo de fallas.
Al terminar la unidad, los alumnos podrán desarrollar programas que pongan en
marcha el funcionamiento de circuitos aplicativos basados en el PIC16F84. Los
programas se realizarán en el computador, se transferirán al microcontrolador y
dejarán operativos al 100% la configuración y por lo menos al 80% la función
propuesta para la aplicación.
TEMARIO
Acceso a la memoria RAM
Temporización
Desarrollo de programas
ACTIVIDADES PROPUESTAS
Los alumnos conectan los dispositivos al PIC.
Los alumnos leen y escriben sobre la memoria RAM.
Los alumnos configuran y ponen en marcha el temporizador.
CARRERAS PROFESIONALES CIBERTEC
MICROCONTROLADORES
55
1. ACCESO A LA MEMORIA RAM
Como ya se mencionó en paginas anteriores, esta memoria sirve para el tratamiento
de datos y variables, y se puede acceder a sus celdas en dos modos: directo e
indirecto. Las celdas disponibles van desde la dirección 0Ch hasta la 4Fh (68 celdas).
1.1.1 Acceso directo
La lectura o escritura de la memoria RAM siempre
se realiza utilizando el registro de trabajo W para
la transferencia del dato, mientras que, el
direccionamiento de la celda,
se realiza utilizando como
operando, directamente la dirección de la celda o
la variable asignada a la dirección.
[Link] Escritura de datos
Si deseamos escribir sobre la
memoria utilizando como operando la dirección de
la celda, utilizaríamos la instruccion MOVWF
DIRECCION, donde DIRECCION es cualquier
celda desde la 0Ch a la 4Fh.
Por ejemplo, suponga que desea escribir el valor
50 en la celda de memoria 30h. Primero
transferimos el dato 50 al registro W: MOVLW .50,
luego, escribimos (transferimos) en la celda 30h
este dato: MOVWF 0X30.
Si en lugar de la dirección, se conoce el nombre
de la variable asociada a la celda de memoria,
este toma el lugar del operando DIRECCION, así,
la instrucción para la escritura será: MOVWF
VARIABLE, donde obviamente VARIABLE es el nombre de la dirección de la celda que
deseamos manipular. Supongamos que la dirección de la celda 20h, tiene asociada la
variable de nombre CELDA20 y queremos escribir sobre esta el valor 55h.
Empezamos transfiriendo el dato 55h al registro W: MOVLW 0X55, enseguida,
transferiríamos este dato sobre la variable CELDA20 (celda 20h): MOVWF CELDA20.
[Link] Lectura de datos
Al igual que la escritura, la transferencia de los datos pasan por el
registro W y la dirección será indicada directamente o a través de una variable. La
instrucción asociada a la lectura es MOFW CELDA, donde CELDA es directamente la
dirección de la celda o la variable asociada a la dirección de la celda.
Por ejemplo, la celda de memoria 18h tiene
asociada la variable de nombre STORE y
deseamos leer su contenido para transferirlo por el PORTB. Primero debemos
transferir el contenido de la celda hacia el registro W: MOVFW 0X18 o MOVFW
STORE y segundo, transferir el valor del registro W sobre el PORTB: MOVWF
PORTB.
1.1.2 Acceso indirecto
Si se van a manipular cadenas de datos y por lo tanto la lectura o escritura sobre las
celdas de memoria es consecutiva y repetitiva, se hace necesario utilizar un puntero
que se desplace entre las direcciones consecutivas de la memoria, para facilitar el
acceso. Este puntero es el registro FSR y cada vez que necesitemos almacenar o leer
CIBERTEC CARRERAS PROFESIONALES
56
un bloque de datos de la memoria RAM, este debe apuntar a la primera celda del
espacio a manipular.
Una vez direccionada la memoria ya se puede leer o escribir sobre esta y de eso se
encargan el registro INDF y el registro de trabajo W. Para escribir en una celda de
memoria se transfiere el valor de W a INDF a través de la instrucción MOVWF INDF y
para leer de una celda de memoria se transfiere el valor de INDF a W a través de la
instrucción MOVFW INDF.
El espacio direccionable de la memoria RAM sólo esta mapeado para el banco 0 y en
este modo indirecto se selecciona a través de dos bits: uno es el bit más significativo
del registro FSR (bit 7) y el otro es el bit IRP del registro STATUS. Debemos asegurar
que estos dos bits se encuentren a cero para accesar adecuadamente a la RAM.
El siguiente gráfico resume lo explicado:
[Link] Lectura de datos
Suponga que en la memoria RAM a partir de la celda 10h se encuentra almacenada
una cadena de datos y desea transferirlos uno tras otro por el PORTB. Lo primero es
seleccionar el Banco 0, fijando a 0 el bit IRP del registro STATUS y el bit 7 del registro
FSR, lo segundo es direccionar al inicio de la cadena, en este
caso, la dirección 10h debe ser transferido sobre el registro de
direccionamiento indirecto FSR, lo tercero es leer el dato del
registro INDF y transferirlo por el PORTB y lo cuarto es avanzar a
la siguiente celda de memoria, lo cual se lograría aumentando el
valor del registro FSR. Luego de esto se vuelve a leer el dato y se
transfiere otra vez por el PORTB. Se aumenta la dirección del
registro FSR tantas veces como datos se deseen leer de la memoria.
En instrucciones sería:
INICIO: BCF STATUS,IRP ; IRP = 0
BCF FSR,7 ; Bit 7 = 0
MOVLW 0X10 ; W = 10h
MOVWF FSR ; FSR = Dirección de inicio de cadena
MOVFW INDF ; W = INDF (DATO de la memoria)
MOVWF PORTB ; PORTB = W = DATO
INCF FSR ; Avanza a la siguiente celda
CARRERAS PROFESIONALES CIBERTEC
MICROCONTROLADORES
57
1.2 Temporización
El PIC16F84 dispone de un dispositivo de temporizado de 8 bits denominado TMR0,
este puede operar como temporizador o como contador. El propósito de disponer de
estas funciones es generar retardos o bases de tiempo (temporizado) o simplemente
contabilizar alguna cantidad de eventos o señales externos (contador). Indiferente de
la operación, el objetivo es saber en que momento culminó el retardo, la base de
tiempo o la cantidad de cuenta, para tomar seguramente alguna decisión importante
en el proceso. Para ello, se dispone del bit indicador T0IF, el cual se pone a 1 cada vez
que el registro de trabajo TMRO generó un desborde (paso de su valor máximo FFh a
su valor mínimo 00h, lo cual, significa que culmino el temporizado o la cuenta.
A partir del estado de este bit se determina el proceso del temporizado o cuenta. Si
esta en 0 es porque el proceso aun esta en marcha, mientras que, cuando esta en 1
es porque ya culminó el proceso. Si no se activa la interrupción del timer/counter, es
necesario verificar constantemente el estado del bit T0IF para enterarnos del instante
de la culminación del proceso, pero, si la interrupción del timer/counter esta activa, el
microprocesador ejecutará automáticamente el algoritmo almacenado en la memoria a
partir de la dirección 0004h (vector de interrupción).
El timer/counter tiene las siguientes caracteristicas:
Dispone de un registro de trabajo de 8 bits (TMR0)
Se puede elegir un clock externo (RA4) o interno (f/4)
Se puede fijar el tipo de flanco (T0SE) de clock externo (subida o bajada)
Se establece y asigna un factor de división (PS2, PS1, PS0, PSA)
Interrumpe (T0IF) cuando el registro TMR0 se desborda (FFh a 00h)
1.2.1 Modos de operación
El TMR0 puede operar en dos modos: Contador y Temporizador. Sin importar el modo
en que opere, el principio de trabajo es el mismo: ingresan los pulsos al registro de
trabajo y este aumenta hasta desbordarse, causando la activación del bit T0IF.
[Link] Modo Contador
Cuando trabajamos con este modo, es porque queremos contabilizar pulsos externos,
provenientes, lo más probable, de sensores. Es necesario seleccionar el clock externo,
fijar el tipo de flanco para el avance de la cuenta, anular el factor de división (a menos
que sea útil), y finalmente inicializar el registro de trabajo.
La aparición de cada flanco del sensor, se inyecta sobre la entrada de reloj del registro
de trabajo (TMR0), lo cual, aumenta en uno su valor. Recordemos que este registro es
de 8 bits, su valor mínimo es 00h y su valor máximo es FFh, es decir 0 y 255. Cuando
el registro se encuentra en su valor máximo (FFh o 255) y en ese instante recibe un
CIBERTEC CARRERAS PROFESIONALES
58
flanco más, este no puede pasar a 256, en cambio, regresa a su valor mínimo y activa
el bit de desborde T0IF.
[Link].1 Secuencia de configuración
Supóngase que deseamos contabilizar 100 pulsos provenientes de un sensor óptico.
El sensor tendrá que ser conectado al pin RA4/T0CKI y la configuración será como se
muestra a continuación:
1- Eleccion del clock externo BSF OPTION_REG, T0CS
2- Fijar flanco de subida para la cuenta BCF OPTION_REG, T0SE
3- Anular el factor de división BSF OPTION_REG, PSA
4- Inicializar el registro de trabajo MOVLW .156
MOVWF TMR0
Recuerde el registro OPTION
RBPU INTDEG T0CS T0SE PSA PS2 PS1 PS0
bit 7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
T0CS: Selector de la fuente de reloj para el TIMER0
1: Externa proveniente del pin RA4/TOCKI
0: Interna proveniente del cristal F/4
T0SE: Selector del tipo de flanco externo para el TIMER0
1: Incremento del TIMER por flanco de bajada del pin RA4/TOCKI
0: Incremento del TIMRE por flanco de subida del pin RA4/TOCKI
PSA: Desviador del factor de división de la señal de reloj
1: Hacia la función de WATCHDOG
0: Hacia la función del TIMER
Recordemos que el indicador T0IF se activa cuando el registro de trabajo pasa de su
valor máximo FFh (255) a su valor mínimo 00h (0). Y como nuestro registro de trabajo
aumentará en uno por cada flanco de subida del sensor, la activación del indicador
T0IF ocurrirá después de 256 (desborde de 255 a 0) – 156 (valor de inicialización del
registro de trabajo) pulsos; los 100 pulsos que deseamos contabilizar. Como fórmula,
el valor de inicialización (VI) del registro de trabajo TMR0 se obtiene al restar 256
menos la cantidad de pulsos a registrar. VI = 256 – #PULSOS.
[Link] Modo Temporizador
Cuando trabajamos en este modo, es porque deseamos generar retardos o bases de
tiempo, como por ejemplo el segundero de un reloj. Es obligado seleccionar el clock
interno el cual obtiene la frecuencia del cristal dividida entre cuatro (f/4), de ser
necesario, elegir un factor de división y asignárselo al TMR0. La aparición de cada
pulso sobre la entrada de reloj del registro de trabajo (TMR0), hará que este aumente
en uno su valor, hasta que en algún momento genere su desbordamiento y por lo
tanto, la activación del indicador T0IF. Cada pulso que llegue al registro de trabajo
tiene una frecuencia que se calcula de la siguiente manera:
F = (f/4)/factor de división = f/(4*factor de división)
Si a esta le añadimos la cantidad de pulsos a contar, tendríamos:
F = f/(4*factor de división*#pulsos)
Pero, el tiempo transcurrido se calcularía:
T = (4*factor de división*#pulsos)/f
CARRERAS PROFESIONALES CIBERTEC
MICROCONTROLADORES
59
Frecuencia F = f/(4*factor de división*#pulsos)
Tiempo T = (4*factor de división*#pulsos)/f
Si tendríamos un cristal 4Mhz y querríamos generar un retardo de 20ms. ¿Cuál sería
el factor de división y cuantos pulsos serían necesarios contabilizar para lograr dicho
temporizado?.
Veamos: 20ms = 4*factord*#pulsos/4Mhz
20ms = factord*#pulsos * 1us ; ya que 1/Mhz es 1 microsegundo (us)
20ms = factord*#pulsos* 1ms/1000 ; ya que 1us = 1ms/1000
20ms*1000 = factord*#pulsos*1ms
2000 = factord*#pulsos
Observe el registro OPTION para saber que valores asignar al factor de división.
Registro OPTION
RBPU INTDEG T0CS T0SE PSA PS2 PS1 PS0
bit 7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
PS2-PS1-PS0: Selectores del factor de división de la señal de reloj
PS2 PS1 PS0 TIMER0 WATCHDOG
0 0 0 2 1
0 0 1 4 2
0 1 0 8 4
0 1 1 16 8
1 0 0 32 16
1 0 1 64 32
1 1 0 128 64
1 1 1 256 128
Haciendo el factord = 8 tendríamos: 2000 = 8*#pulsos
De aquí, #pulsos = 2000/8 = 250
Por lo tanto, el registro TMR0 tendría que ser inicializado con el valor: 256 – 250 = 6
[Link].2 Secuencia de configuración
Supóngase que deseamos lograr un temporizado de 40ms:
1- Eleccion del clock interno f/4 BCF OPTION_REG, T0CS
2- Asignar el factor de división al timer BSF OPTION_REG, PSA
3- Establecer el factor 16 de división BSF OPTION_REG, PS0
BSF OPTION_REG, PS1
BCF OPTION_REG, PS2
4- Inicializar el registro de trabajo MOVLW .6
(256 – 250) MOVWF TMR0
1.3 Desarrollo de programas
CIBERTEC CARRERAS PROFESIONALES
60
1.3.1 Visualización consecutiva de datos
Realice el programa que permita transferir consecutivamente 10
valores sobre el display. Los valores son los códigos del 0 al 9 y
están almacenados consecutivamente en RAM a partir de la celda
20h. El display debe iniciar apagado y por cada vez que se active
el pulsador, los diez valores almacenados en la memoria serán
volcados sobre el display.
El display es del tipo cátodo común (0 off y 1 on) y el pulsador
genera un 0 por su estado off y un 1 por su estado on.
Para direccionar las celdas de memoria utilizará el registro FSR,
apuntando a la primera celda (20h) y para leer el contenido de
estas utilizará el registro INDF.
Empecemos configurando los puertos:
INICIO BSF STATUS,RP0 ; Selección del Banco 1
MOVLW B’00000000’ ; W = 00000000b
MOVWF TRISB ; OUT PORTB
BSF TRISA,2 ; IN PORTA,2
BCF STATUS,RP0 ; Selección del Banco 0
APAGA MOVLW B’00000000’ ; W = 00000000b
MOVWF PORTB ; DISPLAY APAGADO
SENSA BTFSS PORTA,2 ; Salta a PULON si se activa el pulsador
GOTO SENSA ; Regresa a sensar el pulsador
PULON BCF STATUS,IRP ; IRP = 0
MOVLW 0X20 ; W = 20h
MOVWF FSR ; FSR = W (primera celda de la tabla)
VIEW MOVFW INDF ; W = INDF (W = Número)
MOVWF PORTB ; DISPLAY = Número
INCF FSR ; Avanza al siguiente digito en RAM
BTFSS FSR,3 ; Verifica el final de avances en RAM
GOTO UNSEG ; FSR empieza en 20h + 0Ah (10 números)
BTFSS FSR,1 ; hasta la dirección 2Ah de FSR es válida
GOTO UNSEG ; 2Bh ya no (final). Bh en binario 1011
BTFSS FSR,0 ; Estos bits en FSR tienen las posiciones:
GOTO UNSEG ; FSR,3 – FSR,1 y FSR,0
GOTO APAGA ; Regresa para apagar el display y sensar otra vez
1.3.2 Almacenamiento consecutivo de datos
Realice el programa que permita ingresar por el PORTB 10 datos
consecutivos y almacenarlos en memoria RAM a partir de la celda
40h. Cada vez que se active el pulsador significará que en el
PORTB existe un dato listo, el cual, debe ser transferido a la
memoria RAM. Una vez almacenados los 10 datos, el programa
finalizará. Recuerde utilizar el registro FSR para direccionar las
celdas de RAM a partir de la dirección 40h y el registro INDF para
escribir los datos en las celdas.
CARRERAS PROFESIONALES CIBERTEC
MICROCONTROLADORES
61
Iniciemos el programa configurando los puertos:
INICIO BSF STATUS,RP0 ; Selección del Banco 1
MOVLW B’11111111’ ; W = 11111111b
MOVWF TRISB ; IN PORTB
BSF TRISA,0 ; IN PORTA,0
BCF STATUS,RP0 ; Selección del Banco 0
BCF STATUS,IRP ; IRP = 0
MOVLW 0X40 ; W = 40h
MOVWF FSR ; FSR = 40h (dirección inicial de almacenamiento)
SENSA BTFSS PORTA,0 ; Salta a PULON si se activa el pulsador
GOTO SENSA ; Regresa a sensar el pulsador
PULON MOVFW PORTB ; W = PORTB = dipswitches
MOVWF INDF ; INDF = W (celda = dipswitche)
INCF FSR ; Avanza al siguiente digito en RAM
BTFSS FSR,3 ; Verifica el final de avances en RAM
GOTO SENSA ; FSR empieza en 40h + 0Ah (10 números)
BTFSS FSR,1 ; hasta la dirección 4Ah de FSR es válida
GOTO SENSA ; 4Bh ya no (final). Bh en binario 1011
BTFSS FSR,0 ; Estos bits en FSR tienen las posiciones:
GOTO SENSA ; FSR,3 – FSR,1 y FSR,0
STOP GOTO STOP ; Salta a STOP
1.3.3 Temporizado de un led
Realice el programa que permita temporizar el encendido del led.
Este debe permanecer apagado hasta que se active el pulsador, en
ese instante se encenderá y se mantendrá así por 2 segundos, tras
los cuales, se apagará nuevamente. El led está inversamente
conectado, por lo tanto, se apaga con 1 y se enciende con 0.
El pulsador genera un 0 en estado off y un 1 en estado on.
Suponga que el cristal es de 4Mhz y recuerde utilizar la fórmula:
T = (4*factor de división*#pulsos)/f
Si usamos el valor máximo del factor de división (256) y el valor
máximo para el #pulsos (256) obtendríamos el tiempo máximo que
se puede generar con el TMR0. Remplazando valores tenemos:
T = (4*256*256)/4Mhz = 256*256/1Mhz = 65,536 us (1us = 1/1Mhz) = 65.536 ms
El tiempo máximo sólo llega a 65 milisegundos, lejos de los 2 segundos que
necesitamos temporizar. Esto se soluciona creando una base de tiempo y utilizándola
tantas veces hasta lograr el tiempo deseado. Suponga que realiza una base de tiempo
de 50 milisegundos, ¿cuántas bases de este tiempo serían necesarias para llegar a los
2 segundos? Serían necesarios 40, ya que 2seg/50ms = 2000 ms/ 50 ms = 40.
Utilizaremos una variable llamada TIEMPO que funcionará como contador, esta
iniciará con el valor 40 y por cada 50ms transcurridos este disminuirá en 1, al llegar
esta variable a 0 habrá culminado el temporizado.
Calculemos el #pulsos: T = (4*factor de división*#pulsos)/f
Reemplazando valores: 50ms = (4*factor de división*#pulsos)/4Mhz
50ms = factor de división*#pulsos us (1/1Mhz = 1us)
50ms x1000 = fd*#p ms
50,000 = fd*#p
Utilizando el valor máximo para el factor de división (fd) tendríamos:
CIBERTEC CARRERAS PROFESIONALES
62
50,000 = 256*#p, entonces, #p = 50,000/256 = 195.3
Por lo que, el valor inicial del TMR0 sería 256 – 195 = 61
Iniciemos el programa configurando los puertos:
INICIO BSF STATUS,RP0 ; Selección del Banco 1
BCF TRISB,0 ; OUT PORTB,0
BSF TRISA,1 ; IN PORTA,1
BSF OPTION_REG, T0CS ; Selección del clock externo (TMR0 off)
BSF OPTION_REG, PSA ; Asignar el factor de división al TMR0
BSF OPTION_REG, PS0 ; Establecer
BSF OPTION_REG, PS1 ; en 256 el
BCF OPTION_REG, PS2 ; factor de división
BCF STATUS,RP0 ; Selección del Banco 0
BSF PORTB,0 ; LED APAGADO
SENSA BTFSS PORTA, 1 ; Salta a PULON si se activa el pulsador
GOTO SENSA ; Sigue sensando
PULON BCF PORTB, 0 ; LED ENCENDIDO
NEW MOVLW .61 ; Inicia el registro de trabajo
MOVWF TMR0 ; con 61 (256 -195)
MOVLW .40 ; W = 40
MOVWF TIEMPO ; TIEMPO = W (variable de cuenta)
BSF STATUS,RP0 ; Banco 1 ON
BCF OPTION_REG, T0CS ; Selección del clock interno (f/4) TMR0 ON
BCF STATUS,RP0 ; Banco 0 ON
BASET BTFSS INTCON, T0IF ; Salta a ACTUALIZA si se desborda TMR0
GOTO BASET ; Sigue sensando el desborde
ACTUALIZA BCF INTCON, T0IF ; Limpia el indicador de desborde
MOVLW .61 ; Reinicia el registro de trabajo
MOVWF TMR0 ; para controlar 50ms más
DECFSZ TIEMPO ; TIEMPO -1 y salta a TEMPOFF si cero
GOTO BASET ; Sigue el temporizado (50 ms más)
TEMPOFF BSF PORTB, 0 ; LED APAGADO (fin del temporizado)
BSF STATUS,RP0 ; Banco 1 ON
BSF OPTION_REG, T0CS ; Ingreso de clock desactivado TMR0 OFF
BCF STATUS,RP0 ; Banco 0 ON
GOTO SENSA ; Regresa por una nueva activación
1.3.4 Cuenta regresiva temporizada
Realice el programa que permita mostrar una cuente regresiva de
9 a 0 cada vez que se active el pulsador. Cada digito debe
aparecer durante 1 segundo. Después del cero, el display debe
apagarse.
El display es cátodo común por lo que sus segmentos se apagan
con ceros y se encienden con unos.
El pulsador genera un 0 en estado off y un 1 en estado on.
Para los dígitos, suponga que los códigos 9, 8, 7, 6, 5, 4 ,3 ,2 ,1 y
0 se encuentran en ese orden, almacenados en memoria RAM a
partir de la dirección 30h.
Para el temporizado suponga que el cristal es de 8Mhz y recuerde utilizar la fórmula: T
= (4*factor de división*#pulsos)/f
CARRERAS PROFESIONALES CIBERTEC
MICROCONTROLADORES
63
En este caso, también necesitaremos una base de tiempo y una variable que
contabilice una cantidad de estas bases de tiempo. Fijaremos la base de tiempo a
20ms y nuestra variable que se llamará TIEMPO iniciará con 50 (20ms * 50 = 1000ms)
Calculemos el #pulsos: T = (4*factor de división*#pulsos)/f
Reemplazando valores: 20ms = (4*factor de división*#pulsos)/8Mhz
10ms = factor de división*#pulsos us (1/1Mhz = 1us)
10ms x1000 = fd*#p ms
10,000 = fd*#p
Utilizando el valor máximo para el factor de división (fd) tendríamos:
10,000 = 256*#p, entonces, #p = 10,000/256 = 39
Por lo que, el valor inicial del TMR0 sería 256 – 39 = 217
Iniciemos el programa:
INICIO BSF STATUS,RP0 ; Selección del Banco 1
CLRF TRISB ; OUT PORTB
BSF TRISA,2 ; IN PORTA,2
BSF OPTION_REG, T0CS ; Selección del clock externo (TMR0 off)
BSF OPTION_REG, PSA ; Asignar el factor de división al TMR0
BSF OPTION_REG, PS0 ; Establecer
BSF OPTION_REG, PS1 ; en 256 el
BCF OPTION_REG, PS2 ; factor de división
BCF STATUS,RP0 ; Selección del Banco 0
CLRF PORTB ; DISPLAY APAGADO
SENSA BTFSS PORTA, 2 ; Salta a PULON si se activa el pulsador
GOTO SENSA ; Sigue sensando
PULON BSF STATUS,RP0 ; Banco 1 ON
BCF OPTION_REG, T0CS ; Selección del clock interno (f/4) TMR0 ON
BCF STATUS,RP0 ; Banco 0 ON
MOVLW .217 ; Inicia el registro de trabajo
MOVWF TMR0 ; con 217 (256 -39)
BCF STATUS,IRP ; Selección del Banco 0
BCF FSR,7 ; para acceso indirecto de RAM
MOVLW 0X30 ; W = 30h
MOVWF FSR ; FSR = W (dirección inicial de códigos)
UNSEG MOVFW INDF ; W= Código de dígito
MOVWF PORTB ; DISPLAY = W
MOVLW .50 ; W = 50
MOVWF TIEMPO ; TIEMPO = W (variable de cuenta)
BASET BTFSS INTCON, T0IF ; Salta a ACTUALIZA si se desborda TMR0
GOTO BASET ; Sigue sensando el desborde
ACTUALIZA BCF INTCON, T0IF ; Limpia el indicador de desborde
MOVLW .217 ; Reinicia el registro de trabajo
MOVWF TMR0 ; para controlar 20ms más
DECFSZ TIEMPO ; TIEMPO -1 y salta a TEMPOFF si cero
GOTO BASET ; Sigue el temporizado (20 ms más)
TEMPOFF INCF FSR ; Avanza al siguiente digito en RAM
BTFSS FSR,3 ; Verifica el final de avances en RAM
CIBERTEC CARRERAS PROFESIONALES
64
GOTO UNSEG ; FSR empieza en 30h + 0Ah (10 números)
BTFSS FSR,1 ; hasta la dirección 3Ah de FSR es válida
GOTO UNSEG ; 3Bh ya no (final). Bh en binario 1011
BTFSS FSR,0 ; Estos bits en FSR tienen las posiciones:
GOTO UNSEG ; FSR,3 – FSR,1 y FSR,0
BSF STATUS,RP0 ; Banco 1 ON
BSF OPTION_REG, T0CS ; Ingreso de clock desactivado TMR0 OFF
BCF STATUS,RP0 ; Banco 0 ON
GOTO SENSA ; Regresa a sensar el pulsador
CARRERAS PROFESIONALES CIBERTEC
MICROCONTROLADORES
65
Resumen
La memoria RAM puede accederse en dos modos: Directo e Indirecto. El directo
se realiza seleccionando el banco a través del bit RP0 e indicando la dirección de
la celda o el nombre de la celda asociada. El indirecto se hace seleccionando el
Banco a través del bit IRP de registro STATUS y el bit 7 del registro FSR, e
indicando la dirección a través del registro FSR; El registro INDF en este modo se
encarga de la lectura y escritura de la celda de memoria.
El TMR0 es el dispositivo encargado de la temporización y puede funcionar en dos
modos: contador y temporizador. El modo contador se realiza para contabilizar
pulsos externos provenientes de sensores, mientras que, el modo temporizado se
utiliza para crear bases de tiempo o retardos.
El registro OPTION-REG es el encargado de configurar y poner en marcha al
TMR0. Cuando está configurado en modo común se debe sensar constantemente
su bit T0IF indicador de desborde, para saber que culminó el tiempo programado.
Para los tiempos de programación mayores a lo 50ms, se hace necesario el uso de
una variable de cuenta.
Si desea saber más acerca de estos temas, puede consultar las siguientes
páginas.
8 [Link]
Aquí hallará información sobre la función contador del TMR0.
8 [Link]
Aquí hallará información relacionada con el temporizador del TMR0.
CIBERTEC CARRERAS PROFESIONALES
66
UNIDAD DE
APRENDIZAJE
3
SEMANA
PROGRAMACIÓN DEL PIC16F84
LOGRO DE LA UNIDAD DE APRENDIZAJE
Al terminar la unidad, los alumnos podrán implementar circuitos aplicativos
basados en el PIC16F84. La polarización, reset, oscilación y los dispositivos de
salida se adaptarán al microcontrolador sin ningún tipo de fallas.
Al terminar la unidad, los alumnos podrán desarrollar programas que pongan en
marcha el funcionamiento de circuitos aplicativos basados en el PIC16F84. Los
programas se realizarán en el computador, se transferirán al microcontrolador y
dejarán operativos al 100% la configuración y por lo menos al 80% la función
propuesta para la aplicación.
TEMARIO
Interrupciones
Desarrollo de programas
Palabra de configuración
ACTIVIDADES PROPUESTAS
Los alumnos conectan los dispositivos al PIC.
Los alumnos configuran y ponen en marcha las interrupciones.
Los alumnos establecen palabras de configuración.
CARRERAS PROFESIONALES CIBERTEC
MICROCONTROLADORES
67
1. INTERRUPCIONES
Suponga que se encuentra conversando de lo más alegre con un amigo y por la
espalda siente un dedo que lo solicita. ¿Que hace? Ignora la atención o voltea
inmediatamente para averiguar de quien y de que se trata?, algunos responderán que
son inmunes a las interrupciones mientras conversan, pero, la mayoría caerá en la
tentación de voltear y atender a quién interrumpió. Luego de conversar (atender) con
quien interrumpió, retomará la conversación con el amigo, justo en donde había
quedado la conversación. Al igual que sucede en nuestras comunicaciones con las
demás personas, las interrupciones se dán en las comunicaciones del
Microcontrolador con otro Microcontrolador, con una Pc o con algunos dispositivos de
entrada salida.
Las interrupciones son pedidos de atención que ciertos dispositivos solicitan del
Microprocesador. Los dispositivos que no poseen una actividad muy frecuente,
normalmente trabajan pidiendo la atención del microprocesador. Cuando estos tienen
alguna información disponible o requieren de esta, solicitan el servicio del
Microprocesador, el cual, lo atenderá a través de un programa relacionado con el
dispositivo.
Normalmente, un programa principal se encarga de atender constantemente a los
dispositivos de actividad frecuente, mientras que, a los dispositivos de baja actividad
los atenderán las subrutinas de interrupción (programas asociados).
1.1.1 Tratamiento de la interrupción
Mientras el Microprocesador se encuentra
ejecutando el programa principal, su registro
PC (contador de programa o puntero de
instrucciones) va avanzando entre las
direcciones de las instrucciones de la FLASH,
conforme estas se van ejecutando. Suponga
que la PC está direccionando la celda 0100h y
en ese instante se presenta la interrupción de
un dispositivo. El Microprocesador culmina la
ejecución de la instrucción de la celda 0100h,
avanza el PC a la siguiente instrucción
(0101h) y se guarda esta dirección del PC en
la PILA (buffer de memoria temporal),
truncando temporalmente la ejecución del
programa principal. Enseguida el PC se carga
con el vector de interrupción 0004h de FLASH
y el Microprocesador empieza a ejecutar las
instrucciones a partir de esta dirección, la
cual, debe contener la subrutina de atención
del dispositivo. Culminada la atención del
dispositivo (terminada la ejecución de la
subrutina), el PC recupera de la PILA la
dirección guardada (0101h) y retoma la
ejecución de las instrucciones del programa
principal.
1.1.2 Fuentes de interrupción
El PIC16F84 tiene cuatro posibles formas de generar interrupción: dos de estas se
pueden presentar a través del PORTB, otra a través del TMR0 y la última por la
CIBERTEC CARRERAS PROFESIONALES
68
escritura sobre la memoria EEPROM. Cualquiera que cause la interrupción obligará la
modificación del PC al vector 0004h. De aquí, se tiene que averiguar ¿Cuál de las
cuatro fuentes causó la interrupción? Para ejecutar la subrutina de interrupción
relacionada. Cada fuente de interrupción tiene un indicador de interrupción asociado,
el cual, se pone a 1 indicando su presencia, este indicador debe limpiarse luego de
ejecutada la subrutina de interrupción.
1.1.3 Habilitación de las interrupciones
Las fuentes de interrupción sólo pueden obligar al PC direccionar al vector 0004h, si
estas se han configurado y habilitado. De no haberse realizado tal paso, las fuentes
jamás podrán interrumpir y por lo tanto no podrán ser atendidas.
Los registros especiales encargados del tratamiento de las interrupciones son el
registro INTCON y OPTION_REG. Veamos la descripción de sus bits a continuación:
[Link] Registro INTCON
GIE EEIE T0IE INTE RBIE T0IF INTF RBIF
bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
GIE: Habilitador global de las interrupciones
1: Habilitado
0: Deshabilitado
EEIE: Interrupción por escritura de la EEPROM
1: Habilitado
0: Deshabilitado
T0IE: Interrupción por desbordamiento del TIMER0
1: Habilitado
0: Deshabilitado
INTE: Interrupción externa del pin RB0/INT
1: Habilitado
0: Deshabilitado
RBIE: Interrupción por variación del valor de los bits <RB4:RB7>
1: Habilitado
0: Deshabilitado
T0IF: Indicador de interrupción de desbordamiento del TIMER0
1: Activado
0: Desactivado
INTF: Indicador de interrupción del pin RB0/INT
1: Activado
0: desactiva
RBIF: Indicador de interrupción por variación del valor de los bits <RB4:RB7>
1: Activado
0: Desactivado
CARRERAS PROFESIONALES CIBERTEC
MICROCONTROLADORES
69
[Link] Registro OPTION
RBPU INTDEG T0CS T0SE PSA PS2 PS1 PS0
bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
INTEDG: Selector del tipo de interrupción externa RBO/INT
1: activa por flanco ascendente
0: activa por flanco descendente
1.2 Desarrollo de programas
1.2.1 Interrupción del pin RB0/INT
Realice el programa que permita aumentar en uno el valor sobre
los leds del PORTA, por cada interrupción generada por el
pulsador.
El valor inicial sobre los leds debe ser 0.
El pulsador en estado off se encuentra en 0 y cuando pasa al esta
on se hará 1. Es decir la interrupción se presentará cada vez que
en el pin RB0 aparezca un flanco de subida (0 a 1).
La habilitación de esta fuente de interrupción se logra habilitando
tres bits: uno es el bit INTE del registro INTCON (habilitador de la
interrupción del pin RB0/INT), otro es el bit GIE del registro
INTCON (habilitador global de interrupciones) y el otro, es el bit INTEDG del registro
OPTION_REG (selector del tipo de flanco de interrupción). Cuando se presente la
interrupción (flanco de subida del pulsador), el bit indicador relacionado con esta
interrupción, INTF del registro INTCON, se activará, es necesario limpiar este bit una
vez culminada la ejecución de la subrutina de interrupción
Iniciemos el programa:
ORG 0X0000
RESET GOTO INICIO
ORG 0X0004
VECTOR GOTO SINT
INICIO BSF STATUS,RP0 ; Selección del Banco 1
CLRF TRISA ; OUT PORTA
BSF TRISB,0 ; IN PORTB,0 (RB0/INT)
BSF INTCON,GIE ; Habilitación de interrupciones
BSF INTCON,INTE ; Habilitación de la interrupción externa RB0/INT
BSF OPTION_REG, INTEDG ; Interrupción por flanco de subida
BCF STATUS,RP0 ; Selección del Banco 0
MOVLW .0 ;W=0
MOVWF PORTA ; LEDS = W = 0
WAIT GOTO WAIT
SINT INCF PORTA ; LEDS = LEDS + 1
BCF INTCON,INTF ; Se limpia el indicador de interrupción
RETFIE ; Finaliza la subrutina de interrupción
CIBERTEC CARRERAS PROFESIONALES
70
1.2.2 Interrupción por variación de los pines <RB4 – RB7>
Realice el programa que muestre sobre los leds del PORTA una
cuenta descendente hasta 0, cada vez que se modifique el número
sobre los dipswitches conectados a los cuatro bits más
significativos del PORTB. Los leds deben empezar apagados.
La habilitación de esta fuente de interrupción se logra habilitando
dos bits: uno es el bit RBIE del registro INTCON (habilitador de la
interrupción por variación del los bits RB4 – RB7), y el otro es el bit
GIE del registro INTCON (habilitador global de interrupciones).
Cuando se presente la interrupción (variación de alguno de los bits
RB4 – RB7), el bit indicador relacionado con esta interrupción,
RBIF del registro INTCON, se activará, es necesario limpiar este bit una vez culminada
la ejecución de la subrutina de interrupción
Iniciemos el programa:
ORG 0X0000
RESET GOTO INICIO
ORG 0X0004
VECTOR GOTO SINT
INICIO BSF STATUS,RP0 ; Selección del Banco 1
CLRF TRISA ; OUT PORTA
BSF TRISB,4 ; IN PORTB,4
BSF TRISB,5 ; IN PORTB,5
BSF TRISB,6 ; IN PORTB,6
BSF TRISB,7 ; IN PORTB,7
BSF INTCON,GIE ; Habilitación de interrupciones
BSF INTCON,RBIE ; Habilitación de la interrupción por variación
BCF STATUS,RP0 ; Selección del Banco 0
MOVLW .0 ;W=0
MOVWF PORTA ; LEDS = W = 0
WAIT GOTO WAIT
SINT MOVFW PORTB ; W = PORTB
BCF STATUS,C ; Carry = 0
MOVWF NUMERO ; NUMERO = PORTB
RRF NUMERO ; Pasa el valor
RRF NUMERO ; que se encuentra
RRF NUMERO ; en los cuatro bits más significativos
RRF NUMERO ; a los cuatro bits menos significativos
MOVFW NUMERO ; W = NUMERO
MOVWF PORTA ; LEDS = NUMERO (dipswitches)
DESCIENDE DECFSZ PORTA ; LEDS = LEDS – 1 y salta si es cero a SALIR
GOTO DESCIENDE ; Salta a DESCIENDE
SALIR BCF INTCON,RBIF ; Se limpia el indicador de interrupción
RETFIE ; Finaliza la subrutina de interrupción
CARRERAS PROFESIONALES CIBERTEC
MICROCONTROLADORES
71
1.2.2 Interrupción por el TMR0
Realice el programa que muestre sobre los leds una cuenta
descendente de 15 a 0, cada vez que se active el pulsador. Los
valores de la cuenta deben mostrarse sobre los leds durante 1
segundo.
Considere que el cristal es de 4Mhz, utilice una base de tiempo de
50ms y asigne 256 al factor de división para configurar el TMR0.
La habilitación de esta fuente de interrupción se realiza habilitando
dos bits: uno es el bit T0IE (habilitador de interrupción por
desbordamiento del TMR0) y el otro, es el bit GIE (habilitador
global de interrupciones), ambos del registro INTCON.
Cuando se presente la interrupción (desbordamiento del TMR0), el bit indicador
relacionado con esta interrupción, T0IF del registro INTCON, se activará, es necesario
limpiar este bit una vez culminada la ejecución de la subrutina de interrupción
Calculemos el #pulsos: T = (4*factor de división*#pulsos)/f
Reemplazando valores: 50ms = (4*factor de división*#pulsos)/4Mhz
50ms = factor de división*#pulsos us (1/1Mhz = 1us)
50ms x1000 = fd*#p ms
50,000 = fd*#p
Utilizando el valor 256 para el factor de división (fd) tendríamos:
50,000 = 256*#p, entonces, #p = 50,000/256 = 195
Por lo que, el valor inicial del TMR0 sería 256 – 195 = 61
Iniciemos el programa:
ORG 0X0000
RESET GOTO INICIO
ORG 0X0004
VECTOR GOTO SINT
INICIO BSF STATUS,RP0 ; Selección del Banco 1
CLRF TRISA ; OUT PORTA
BSF TRISB,0 ; IN PORTB,0
BSF INTCON,GIE ; Habilitación de interrupciones
BSF INTCON,T0IE ; Habilitación de la interrupción del TMR0
BSF OPTION_REG, T0CS ; Selección del clock externo (TMR0 off)
BSF OPTION_REG, PSA ; Asignar el factor de división al TMR0
BSF OPTION_REG, PS0 ; Establecer
BSF OPTION_REG, PS1 ; en 256 el
BCF OPTION_REG, PS2 ; factor de división
BCF STATUS,RP0 ; Selección del Banco 0
MOVLW .0 ;W=0
MOVWF PORTA ; LEDS = APAGADOS
SENSA BTFSS PORTB,0 ; Salta a PULON si se activa el pulsador
GOTO SENSA ; Salta a SENSA y sigue sensando el pulsador
PULON MOVLW .15 ; W = 15
MOVWF PORTA ; LEDS = W (Inicio de cuenta descendente)
MOVLW .61 ; Inicia el registro de trabajo
MOVWF TMR0 ; con 217 (256 -39)
CIBERTEC CARRERAS PROFESIONALES
72
MOVLW .40 ; W = 40
MOVWF TIEMPO ; TIEMPO = W (variable de cuenta)
BSF STATUS,RP0
BCF OPTION_REG, T0CS ; Selección del clock interno (f/4) TMR0 ON
BCF STATUS,RP0
GOTO SENSA
SINT BCF INTCON, T0IF ; Limpia el indicador de desborde
MOVLW .61 ; Reinicia el registro de trabajo
MOVWF TMR0 ; para controlar 50ms más
DECFSZ TIEMPO ; TIEMPO -1 y salta a TEMPOFF si cero
RETFIE
TEMPOFF DECFSZ PORTA ; PORTA -1 (después de 1seg) y salta si 0
GOTO SALIR ; Salta a SALIR de la subrutina
BTFSS PORTA,0 ; Banco 1 ON
BSF OPTION_REG, T0CS ; Ingreso de clock desactivado TMR0 OFF
BCF STATUS,RP0 ; Banco 0 ON
SALIR RETFIE
1.3 Palabra de configuración
El PIC16F84 dispone de una palabra de configuración de 14 bits, la cual, sólo se
puede manipular durante el proceso de grabación. Dichos bits ocupan la posición
reservada de memoria de programa 2007h y se encargan de proteger la información
de la memoria de programa, activar las funciones de POWER-UP y WATCHDOG y
seleccionar el tipo de oscilador que se utilizará.
La protección de la memoria se hace para evitar la copia, es conveniente cuando se
llegan a realizar programas de proyectos importantes.
La función Power-Up es importante para asegurar la estabilidad del Oscilador. Cada
vez que se genera un Reset, se detiene la función del Microcontrolador, lo suficiente
para que el oscilador se estabilice. Enseguida, el Microcontrolador procede.
La función WatchDog tiene como función evitar que el Microcontrolador quede
bloqueado en lazos infinitos. Si esto sucediera, el WatchDog genera automáticamente
un Reset, provocando la reinicialización del sistema.
La selección del oscilador sólo es para indicar el tipo de oscilador que utilizaremos, el
cual, como sabemos podría ser del tipo: RC, HS, XT o LP.
En la siguiente tabla se muestra la estructura de la Palabra de configuración:
13 12 11 10 9 8 7 6 5 4 3 2 1 0
CP CP CP CP CP CP CP CP CP CP PWRTE WDTE FOSC1 FOSC0
1.3.1 Protección de la memoria
De esta función se encargan los bits de la posición 13 a la 4. Si su valor es 1 la
protección esta desactivada, en cambio, si es 0 la memoria quedará protegida y no
podrá ser leída ni escrita por otro programador.
CARRERAS PROFESIONALES CIBERTEC
MICROCONTROLADORES
73
1.3.2 Función Power-Up
De esta función se encarga el bit 3. Un 1 sobre este bit desactiva la función, pero, un 0
lo activa y por lo tanto, permite la estabilidad del oscilador.
1.3.3 Función WatchDog
De esta función se encarga el bit 2. Un 1 sobre este bit desactiva la función, pero, un 0
lo activa y por lo tanto, permite el desbloqueo causado por lazos infinitos.
1.3.4 Selección del oscilador
De esta función se encargan los bits 1 y 0. La combinación sobre estos elige uno de
los cuatro tipos de oscilación:
Bit 1 Bit 0 Oscilador
0 0 LP
0 1 XT
1 0 HS
1 1 RC
CIBERTEC CARRERAS PROFESIONALES
74
Resumen
Las Interrupciones son pedidos de atención que algunos dispositivos solicitan al
Microcontrolador. Esta atención se realiza a través de la ejecución de subrutinas
asociadas a dichos dispositivos.
El PIC16F84 tiene cuatro fuentes de interrupción: Dos de estas se pueden generar
a través del PORTB (presencia de flanco en el pin RB0/INT y variación del estado
de los pines RB4-RB7), la tercera es generada por el desbordamiento del TMR0 y
la cuarta se genera por la escritura de alguna celda de la memoria EEPROM.
Estas fuentes deben habilitarse para que realmente puedan interrumpir. El registro
INTCON contiene los bits de habilitación y los bits indicadores de la presencia de
interrupción.
Cada vez que se produce una interrupción, el PC, detiene temporalmente la
ejecución del programa en curso y direcciona el vector 0004h de memoria FLASH
para ejecutar las subrutinas de interrupción. Culminada esta atención, retoma la
ejecución del programa detenido.
Para saber cual de las cuatro fuentes a interrumpido, debemos verificar los bits
indicadores de la presencia de interrupción. De este modo, sabremos que subrutina
ejecutar para lograr la atención. Una vez culminada la ejecución debemos limpiar el
bit indicador de interrupción respectivo.
Si desea saber más acerca de estos temas, puede consultar las siguientes
páginas.
8 [Link]
Aquí hallará información relacionada con las interrupciones
8 [Link]
Aquí hallarás programas básicos y con interrupción.
CARRERAS PROFESIONALES CIBERTEC
MICROCONTROLADORES
75
UNIDAD DE
APRENDIZAJE
4
SEMANA
EL PIC16F877
LOGRO DE LA UNIDAD DE APRENDIZAJE
A terminar la unidad, los alumnos podrán enumerar las capacidades del
Microcontrolador PIC16F877, describiendo las características y funciones de cada
una de estas, en forma escrita, clara y concisa.
TEMARIO
El PIC16F877
Puesta en marcha
Arquitectura interna
ACTIVIDADES PROPUESTAS
Los alumnos describen las características del PIC16F877.
Los alumnos reconocen la función de las señales de inicialización.
Los alumnos distinguen las unidades internas del PIC16F877.
CIBERTEC CARRERAS PROFESIONALES
76
1. EL PIC16F877
El PIC16F87 pertenece a la gama alta, es decir, es un Microcontrolador de mayor
complejidad, ideal para el desarrollo de aplicaciones avanzadas.
1.2.1 Descripción del PIC16F877
La figura de arriba muestra la disposición de pines de este PIC. VDD y VSS son los
pines de polarización, +5V y GND respectivamente. OSC1 y OSC2 son los pines para
el reloj, en estos se conectará el cristal. MCLR es el pin de programación o reset,
durante la programación esta patilla se conecta al voltaje de programación (13,2V),
mientras que, en funcionamiento este debe conectarse a un arreglo RC para recibir el
pulso de inicialización. Los pines RAx, RBx, RCx, RDx y REx son los pines de los
puertos A, B, C, D y E respectivamente, a través de estas patillas el microcontrolador
se conectará con el sistema a controlar.
[Link] Descripción de la CPU
Este Microcontrolador posee en su interior un Microprocesador de 8 bits que opera a
una frecuencia máxima de 20Mhz, soporta un total de 35 instrucciones las que ejecuta
en un ciclo de maquina, excepto las de salto que ejecuta en dos ciclos. Un ciclo de
maquina equivale a 4 periodos de reloj (f/4), donde f es la frecuencia del cristal
utilizado para proveer la señal de reloj.
[Link] Descripción de las memorias
El PIC16F877 al igual que el PIC16F84, posee tres tipos de memorias: flash, eeprom y
ram.
[Link].1 Memoria flash
La memoria flash es la memoria de programas destinada para almacenar las
instrucciones, tiene una capacidad de 8192 celdas de 14 bits (8K words), es decir, se
pueden introducir en esta memoria hasta 8192 instrucciones. Esta memoria es la que
CARRERAS PROFESIONALES CIBERTEC
MICROCONTROLADORES
77
recibirá desde el computador los programas desarrollados durante los laboratorios.
Esta memoria puede ser borrada y programada 10 mil de veces. Las instrucciones
depositadas en esta no se perderán ni modificarán aún si pierde la energía de
polarización.
[Link].2 Memoria eeprom
La memoria eeprom es una memoria destinada para el almacenamiento de datos y
variables. Este tipo de memoria al igual que la flash no pierde su información aun si
pierde la energía que lo polariza. Su capacidad es de 256 celdas de 8 bits, es decir,
256 bytes. Esta memoria puede ser regrabada 10 millones de veces.
[Link].3 Memoria ram
La memoria ram es una memoria destinada al almacenamiento de datos, pero a su
vez, en esta se encuentran todos los registros de configuración de todas las funciones
del PIC. Su capacidad es de 368 celdas de 8 bits, es decir, 368bytes.
[Link] Descripción de las unidades de entrada y salida
El PIC16F877 dispone de cinco puertos denominados PORTA, PORTB, PORTB,
PORTC, PORTD y PORTE. El puerto A esta formado por 6 pines, mientras que el
puerto B, C y D por 8 pines y el por E por sólo dos pines. Es decir, 33 patillas a través
de los cuales el Microcontrolador se conectará con las aplicaciones.
[Link] Dispositivos especiales
Además de los puertos este PIC posee:
3 temporizadores denominados TMR0, TMR1 y TMR2.
1 puerto de comunicación serie USART.
1 puerto de comunicación serie I²C.
8 canales de conversión análoga digital.
1.3 Puesta en marcha
Poner en funcionamiento al Microcontrolador significa polarizarlo, proveerle la señal de
reloj y asegurar el impulso de inicialización básico para que pueda funcionar
1.3.1 Polarización
Este PIC necesita ser energizado con +5V y GND ya sea durante la programación de
su memoria flash o durante su funcionamiento. Las patillas utilizadas para esto son
VDD y VSS. Este PIC tiene duplicadas estas patillas, pero, no es necesario conectar
las dos patillas VDD a +5V, ni tampoco conectar las dos patillas VSS a GND, basta
con adaptar una de las dos. Según sea conveniente se utilizará una u otra patilla de
polarización.
1.3.2 Reset
Todos los Microcontroladores necesitan recibir un impulso apenas se energizan. Esto
es fundamental para inicializar sus unidades y registros. De no presentarse este
impulso, el Microcontrolador probablemente quedaría bloqueado ejecutando algún
grupo de instrucciones que nada tienen que ver con la ejecución del programa
preparado, ya que, el PC (contador de programa) podría estar apuntando a cualquier
parte de la memoria de programa flash. Este impuso, entre otras cosas, asegura que
el registro PC apunte a la primera celda de la memoria flash, es decir, el
Microcontrolador queda listo para leer, interpretar y ejecutar su primera instrucción.
CIBERTEC CARRERAS PROFESIONALES
78
Este impulso se logra realizando un arreglo RC sobre la patilla MCLR, tal como se
muestra en la figura de la izquierda. Valores comunes serían 1K ohmios para la
resistencia y 10 uF para el condensador. Si durante el funcionamiento del
Microcontrolador ocurriera algún evento no deseado y este quedase bloqueado o
simplemente se requiere reiniciar la ejecución del programa desde el principio, es
necesario inyectar un nuevo impulso sobre MCLR. Esto se logra añadiendo un
pulsador, tal como se muestra en la figura.
1.3.3 Reloj
La función de reloj, también conocida como sistema de oscilación, es fundamental
para que el Microcontrolador se ponga en marcha, sin esta señal los
Microcontroladores no podrían realizar la más mínima labor. Estos necesitan los
pulsos repetitivos de la señal de reloj para leer, interpretar y ejecutar las instrucciones
almacenadas en su memoria flash. Los pines destinados para esta función son OSC1
y OSC2, a estas se le tendrán que adaptar un cristal, un arreglo RC, o una fuente
externa de reloj.
[Link] Modos de oscilación
El PIC16F84 puede trabajar hasta en cuatro modos de oscilación: LP, XT, HS y RC.
[Link].1 Modo LP
Este sistema esta diseñado para que el microcontrolador opere a frecuencias bajas
comprendidas entre los 32Khz y 200Khz. Es posible adaptar un oscilador cerámico o
un oscilador de cristal de cuarzo. Este debe ser acompañado por dos condensadores
cuyos valores dependen de la frecuencia de trabajo. Los fabricantes facilitan esta
información en tablas de la hoja de datos del PIC.
[Link].2 Modo XT
Este sistema esta diseñado para que el microcontrolador opere a frecuencias
comprendidas entre los 100Khz y 4Mhz. Es posible adaptar un oscilador cerámico o un
oscilador de cristal de cuarzo. Este debe ser acompañado por dos condensadores
cuyos valores típicos están entre los 15pF y 33pF.
[Link].3 Modo HS
Este sistema esta diseñado para que el microcontrolador opere a frecuencias
comprendidas entre los 4Mhz y 20Mhz. Es posible adaptar un oscilador cerámico o un
oscilador de cristal de cuarzo. Este debe ser acompañado por dos condensadores y
una resistencia cuyos valores dependen de la frecuencia de trabajo. Los fabricantes
facilitan esta información en tablas de la hoja de datos del PIC.
[Link].4 Modo RC
Este es un sistema poco preciso pero económico y se realiza utilizando una resistencia
y un condensador. Los valores recomendaos por los fabricantes para este tipo de
oscilador son: 5K ohmios < R <100K ohmios y C > 20pF.
CARRERAS PROFESIONALES CIBERTEC
MICROCONTROLADORES
79
1.4 Arquitectura interna
El PIC16F877 al igual que el PIC16F84 se caracteriza por tener:
Una arquitectura Harvard.
Un procesamiento segmentado (pipeline)
Un procesador tipo RISC
Un formato ortogonal
1.4.1 Arquitectura Harvard
Esta Arquitectura a diferencia de la arquitectura de Von Newman, trabaja con dos
memorias independientes de datos y de instrucciones, a las que se conecta a través
de dos grupos de buses separados. Ambos buses son totalmente independientes y de
diferentes anchos, esto permite que el microprocesador pueda acceder
simultáneamente a la memoria de datos y a la de instrucciones. tal diferencia permite
que las instrucciones se ejecuten en tiempos mucho más cortos.
1.4.2 Procesamiento segmentado o Pipeline
Este procesamiento puede procesar dos instrucciones al mismo tiempo aunque en
diferente fase cada una. Es decir, mientras se está ejecutando una instrucción, se esta
realizando la lectura de la siguiente instrucción. De esta manera, se puede ejecutar
cada instrucción en un ciclo de maquina.
Para los PICs un ciclo de máquina equivale a cuatro ciclos de reloj, todas sus
instrucciones se ejecutan en este periodo a excepción de las instrucciones de salto
que toman dos ciclos de máquina.
1.4.3. Procesador RISC (reduced instruction set computer)
Los procesadores PIC se caracterizan por tener un juego reducido de instrucciones,
esto permite que las instrucciones sean simples y se ejecuten en un solo ciclo de
máquina.
Este PIC soporta 35 instrucciones, las cuales están organizadas por su orientación al
byte, al bit y a las constantes.
1.4.4 Formato ortogonal
El formato ortogonal se refiere a las fuentes y destinos en
el procesamiento de una instrucción. En el caso de los
PICs, cualquier elemento interno puede funcionar como
fuente o destino, evitando las limitaciones de
procesadores antiguos. En la figura de la derecha
observamos esta característica donde la ALU (unidad
aritmética lógica) tiene como fuentes al registro de trabajo
W y los registros o celdas de la memoria de datos, y como
destino podemos observar que puede ser cualquiera de
estos elementos indicados.
CIBERTEC CARRERAS PROFESIONALES
80
Podemos notar en la figura de abajo la arquitectura Harvard del PIC16F877. La
memoria de programas FLASH (que almacena las instrucciones) tiene un bus
conectado directamente sobre el registro de instrucciones y este a su vez se conecta
con el decodificador de instrucciones, con el multiplexor de direcciones o al multiplexor
de entrada para las operaciones aritmético lógicas. En cambio, la memoria RAM y la
memoria EEPROM (que almacenan los datos) comparten otro camino, otro bus, el
cual se conecta al registro FSR de direccionamiento indirecto de memoria RAM, a los
PUERTOS, al registro de trabajo W, al multiplexor de entrada para las operaciones
aritmético lógicas, a los canales de conversión A/D, a los puertos de comunicación
serie y a los TIMERS.
También podemos observar el formato de trabajo ortogonal. La ALU (unidad aritmética
lógica) recibe por una de sus entradas la información proveniente del bus de la
memoria flash o del bus de las memorias ram o eeprom y por su otra entrada recibe la
información proveniente del registro de trabajo W. El resultado de las operaciones es
devuelto sobre el registro de trabajo W, sobre los puertos, los timers, sobre los puertos
seriales, sobre los canales de conversión A/D, sobre las memorias ram, eeprom y
sobre algunos registros especiales como el FSR, STATUS y PC.
CARRERAS PROFESIONALES CIBERTEC
MICROCONTROLADORES
81
Resumen
El PIC16F877 lo desarrolla Microchip y pertenece a la gama alta de los
microcontroladores. Tiene un Microprocesador de 8 bits, una memoria FLASH de
8K words, una memoria EEPROM de 256 bytes, una RAM de 368 bytes, cinco
puertos: PORTA, PORTB, PORTC, PORTD y PORTE, tres temporizadores: TMR0,
TMR1 y TMR2, puertos serie tipo USART e I²C y 8 canales de conversión A/D.
El PIC, para funcionar necesita una señal de reloj, la cual, puede ser del tipo RC,
XT, HS o LP. Además, es necesario realizar un arreglo RC sobre la patilla MCLR
que asegure su inicialización interna.
Su arquitectura es del tipo Harvard (acceso independiente y simultáneo a la
memoria de datos e instrucciones), realiza procesamiento segmentado de las
instrucciones (mientras una se ejecuta la siguiente instrucción se lee), posee un
reducido número de instrucciones (35) y dispone de un formato ortogonal para la
ejecución de las instrucciones aritmético lógicas (todos los elementos internos
pueden ser fuentes o destino).
Si desea saber más acerca de estos temas, puede consultar las siguientes
páginas.
8 [Link]
Aquí hallará información sobre arquitectura, reset y oscilación del PIC.
CIBERTEC CARRERAS PROFESIONALES
82
UNIDAD DE
APRENDIZAJE
4
SEMANA
10
EL PIC16F877
LOGRO DE LA UNIDAD DE APRENDIZAJE
Al terminar la unidad, los alumnos describirán las capacidades y funciones del
Microcontrolador PIC16F84. La descripción será escrita y no excederá los 30
minutos.
TEMARIO
Mapeo de la memoria FLASH
Organización de la memoria RAM
Registros y funciones
ACTIVIDADES PROPUESTAS
Los alumnos describen las funciones relacionadas con la memoria FLASH.
Los alumnos distinguen la estructura y acceso de la memoria RAM.
Los alumnos describen la función de los registros.
CARRERAS PROFESIONALES CIBERTEC
MICROCONTROLADORES
83
1. MAPEO DE LA MEMORIA FLASH
Esta memoria, encargada de proveer las
instrucciones al microprocesador debe ser
adecuadamente tratada, de lo contrario
podríamos cometer errores involuntarios
de programación.
La capacidad física de esta memoria es de
8Kwords, donde cada Word esta formado
por 14 bits. Su direccionamiento va desde
la posición 0000h hasta la 1FFFh. Esta
área es conocida como la memoria de
usuario.
El PC (contador de programa) es un
registro que se encarga de direccionar a
cada una de las instrucciones de esta
memoria. Cada vez que el pin MCLR del
microcontrolador recibe un pulso bajo, el
PC se fija automáticamente a 0000h
(vector de reset) garantizando que se
apunte a la primera instrucción del
programa.
Cada vez que se presente alguna interrupción, el valor del PC es guardado en uno de
los 8 niveles de la Pila, para recibir luego y de modo automático la dirección 0004h
(vector de interrupción).
La Pila es un arreglo de registros que sirve para guardar o restaurar los valores del
PC. Cada vez que se presenta una interrupción o se invoca a alguna subrutina (CALL),
el valor del PC es guardado en la Pila, en cambio, cuando se termina la ejecución de
una subrutina de interrupción (RETFIE) o se finaliza la ejecución de una subrutina
común (RETURN o RETLW), el PC recupera de la Pila su valor.
La memoria de usuario está organizada por páginas de 2K words y es de fundamental
importancia trasladarse, desde los programas, adecuadamente sobre estas páginas.
Si desde la pagina 0 se desea ejecutar alguna subrutina ubicada en la pagina 2, no
basta con indicarle al PC la etiqueta (dirección) de esta subrutina, es necesario indicar
la página a través del registro PCLATH, específicamente dos de sus bits 3 y 4 como se
muestra en la tabla:
PCLATH,4 PCLATH,3 Página
0 0 0
0 1 1
1 0 2
1 1 3
Y cuando deseamos retornar de una subrutina que se encuentra en otra página,
también se hace necesario seleccionar la página de destino.
Supongamos que deseamos ejecutar la subrutina de nombre DELAY la cual está
ubicada en la página dos, las instrucciones serían:
BSF PCLATH,4 ; Selección de
BCF PCLATH,3 ; la página 2
CALL DELAY ; Ejecutar la subrutina DELAY
CIBERTEC CARRERAS PROFESIONALES
84
1.1 Organización de la memoria RAM
Esta memoria es fundamental para el tratamiento de los datos y variables que maneja
un programa. En la figura de abajo se nota que esta formada por dos partes: Los
registros de funciones especiales (SFR) y los registros de propósito general (GPR).
1.1.1 Registros de funciones especiales (SFR)
Estos registros están formados por las primeras posiciones de la memoria y tienen un
papel importante en la función y configuración del Microcontrolador.
1.1.2 Registros de propósito general (GPR)
Están formados por 368 bytes y obviamente sirven para el tratamiento de los datos y
variables del programa. Cada Banco contiene 96 de estos registros.
1.1.3 Bancos de Memoria
La RAM esta estructurada por cuatro bancos de memoria: El banco 0, banco 1. banco
2 y el banco 3. Los registros de funciones especiales y de propósito general se
encuentran ubicados en los dos Bancos, tal como se muestra en la siguiente figura:
CARRERAS PROFESIONALES CIBERTEC
MICROCONTROLADORES
85
En las direcciones 00h a 1Fh del banco 0, 80h a 9Fh del banco 1, 100h a 10Fh del
banco 2 y 180h a 18Fh del banco 3 están ubicados los registros de funciones
especiales (SFR). Algunos de estos registros como Indirect, STATUS, FSR, se
encuentran en los cuatro bancos con el único propósito de facilitar su acceso.
[Link] Selección de los Bancos
El acceso a los Bancos se realiza a través de la manipulación de los bits 6 (RP1) y 5
(RP0) del registro STATUS. Las cuatro combinaciones que se pueden generar con
estos bits seleccionan a uno de los cuatro bancos, tal como se indica en la tabla:
RP1 RP0 Banco
0 0 0
0 1 1
1 0 2
1 1 3
1.2 Registros y funciones
Los registros tienen como siempre un papel muy importante y en el caso de los PICs
su importancia se multiplica porque no son simples almacenes de información, están
encargados de llevar la configuración y habilitación de las funciones que los PICs
poseen. A continuación se muestran cuatro tablas, con los registros de funciones
especiales de los cuatro bancos. En cada una se indica una breve descripción de los
registros.
BANCO 0
00h INDF Registro de lectura/escritura de RAM en acceso indirecto
01h TMR0 Registro de trabajo del TMR0
02h PCL Registro contador de programa (parte baja)
03h STATUS Registro de estado de la ALU y selector de los Bancos de RAM
04h FSR Registro direccionador de RAM en el modo indirecto
05h PORTA Puerto A de lectura y escritura de 5 bits
06h PORTB Puerto B de lectura y escritura de 8 bits
07h PORTC Puerto C de lectura y escritura de 8 bits
08h PORTD Puerto D de lectura y escritura de 8 bits
09h PORTE Puerto E de lectura y escritura de 3 bits
0Ah PCLATH Registro contador de programa (parte alta)
0Bh INTCON Registro de configuración de las primeras interrupciones
0Ch PIR1 Registro indicador de estado de periféricos
0Dh PIR2 Registro indicador de estado de periféricos
0Eh TMR1L Registro de trabajo del TMR1 (parte baja)
0Fh TMR1H Registro de trabajo del TMR1 (parte alta)
BANCO 0
CIBERTEC CARRERAS PROFESIONALES
86
10h T1CON Registro de configuración del TMR1
11h TMR2 Registro de trabajo del TMR2
12h T2CON Registro de configuración del TMR2
13h SSPBUF Registro buffer de transmisión y recepción serial síncrona
14h SSPCON Registro de control serial síncrono
15h CCPR1L Registro de trabajo del módulo 1 captura y comparación (low)
16h CCPR1H Registro de trabajo del módulo 1 captura y comparación (high)
17h CCPCON Registro de configuración del módulo 1 captura y comparación
18h RCSTA Registro de configuración de la recepción serie
19h TXREG Registro de transmisión de datos serie
1Ah RCREG Registros de recepción de datos serie
1Bh CCPR2L Registro de trabajo del módulo 2 captura y comparación (low)
1Ch CCPR2H Registro de trabajo del módulo 2 captura y comparación (high)
1Dh CCPCON Registro de configuración del módulo 2 captura y comparación
1Eh ADRESH Registro de datos de la conversión A/D (parte alta)
1Fh ADCON0 Registro de configuración 0 del conversor A/D
BANCO 1
80h INDF Registro de lectura/escritura de RAM en acceso indirecto
81h OPTION Registro de Configuración del TMR0
82h PCL Registro contador de programa (parte baja)
83h STATUS Registro de estado de la ALU y selector de los Bancos de RAM
84h FSR Registro direccionador de RAM en el modo indirecto
85h TRISA Registro de configuración del PORTA
86h TRISB Registro de configuración del PORTB
87h TRISC Registro de configuración del PORTC
88h TRISD Registro de configuración del PORTD
89h TRISE Registro de configuración del PORTE
8Ah PCLATH Registro contador de programa (parte alta)
8Bh INTCON Registro de configuración de las primeras interrupciones
8Ch PIE1 Registro de configuración de interrupciones de periféricos 1
8Dh PIE2 Registro de configuración de interrupciones de periféricos 2
8Eh PCON Registro de control de reset
91h SSPCON2 Registro e control 1 de la comunicación serie síncrona
92h PR2 Registro de trabajo del periodo del TMR2
93h SSPADD Registro de dirección de la comunicación serie síncrona
94h SSPSTAT Registro de estado de la comunicación serie síncrona
98h TXSTA Registro de control de la transmisión serie
99h SPBRG Registro generador de velocidad de la comunicación serie
9Eh ADRESL Registro de datos de la conversión A/D (parte baja)
9Fh ADCON1 Registro de configuración 1 del conversor A/D
BANCO 2
100h INDF Registro de lectura/escritura de RAM en acceso indirecto
CARRERAS PROFESIONALES CIBERTEC
MICROCONTROLADORES
87
101h TMR0 Registro de trabajo del TMR0
102h PCL Registro contador de programa (parte baja)
103h STATUS Registro de estado de la ALU y selector de los Bancos de RAM
104h FSR Registro direccionador de RAM en el modo indirecto
106h PORTB Puerto B de lectura y escritura de 8 bits
10Ah PCLATH Registro contador de programa (parte alta)
10Bh INTCON Registro de configuración de las primeras interrupciones
10Ch EEDATA Registro de datos de EEPROM y FLASH (parte baja)
10Dh EEADR Registro de direcciones de EEPROM y FLASH (parte baja)
10Eh EEDATH Registro de datos de FLASH (parte alta)
10Fh EEADRH Registro de direcciones de FLASH (parte alta)
BANCO 3
180h INDF Registro de lectura/escritura de RAM en acceso indirecto
181h OPTION Registro de Configuración del TMR0
182h PCL Registro contador de programa (parte baja)
183h STATUS Registro de estado de la ALU y selector de los Bancos de RAM
184h FSR Registro direccionador de RAM en el modo indirecto
186h TRISB Registro de configuración del PORTB
18Ah PCLATH Registro contador de programa (parte alta)
18Bh INTCON Registro de configuración de las primeras interrupciones
18Ch EECON1 Registro de control de la memoria EEPROM
18Dh EECON2 Registro secuenciador de escritura (55h y AAh) de la EEPROM
1.2.1 Funciones de los registros
Cada registro tiene una capacidad máxima de 8 bits y cada bit tiene su función
especial, por tal motivo, es necesario desagregar a los registros en función de sus bits
para tener una idea mas completa de su función.
[Link] El registro STATUS
Este es el registro de estado, esta formado por 8 bits y contiene los indicadores de
estado de la ALU, el bit que permite la selección del banco de memoria ram, y los
indicadores de watchdog y power down. Abajo se muestra la disposición de sus bits:
IRP RP1 RP0 T0 PD Z DC C
bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
Los bits IRP y RP1, no están implementados para este microcontrolador.
RP0 : Selector del banco activo de memoria ram.
0: Banco 0
1: Banco 1
TO : Indicador de ocurrencia del watchdog timer
1: Desactivado
0: Activado
PD: Indicador de funcionamiento de power down
1: Desactivado
0: Activado (modo SLEEP)
CIBERTEC CARRERAS PROFESIONALES
88
Z: Indicador de cero
0: Desactivado
1: Activado
DC: Indicador de carry o borrow decimal
0: Desactivado
1: Activado
C: Indicador de carry o borrow octal
0: Desactivado
1: Activado
[Link] El registro OPTION
El registro de opción también esta formado por 8 bits y contiene los bits de control para
la configuración de trabajo del TIMER0 y WATCHDOG, los bits de habilitación de
interrupción externa y del TIMER0 y la habilitación de la función PULL-up para los bits
del PUERTOB. A continuación se muestran sus bits:
RBPU INTDEG T0CS T0SE PSA PS2 PS1 PS0
bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
RBPU: Función pull-up para el PUERTOB
1: Funcion desactivada
0: Funcion activada
INTEDG: Selector del tipo de interrupción externa RBO/INT
1: activa por flanco de subida
0: activa por flanco de bajada
T0CS: Selector de la fuente de reloj para el TIMER0
1: Externa proveniente del pin RA4/TOCKI
0: Interna proveniente del cristal F/4
T0SE: Selector del tipo de flanco externo para el TIMER0
1: Incremento del TIMER por flanco de bajada del pin RA4/TOCKI
0: Incremento del TIMRE por flanco de subida del pin RA4/TOCKI
PSA: Desviador del factor de división de la señal de reloj
1: Hacia la función de WATCHDOG
0: Hacia la función del TIMER
PS2-PS1-PS0: Selectores del factor de división de la señal de reloj
PS2 PS1 PS0 TIMER0 WATCHDOG
0 0 0 2 1
0 0 1 4 2
0 1 0 8 4
0 1 1 16 8
1 0 0 32 16
1 0 1 64 32
1 1 0 128 64
1 1 1 256 128
CARRERAS PROFESIONALES CIBERTEC
MICROCONTROLADORES
89
[Link] El registro INTCON
El registro de interrupción también está formado por 8 bits y contiene los bits de
habilitación para las interrupciones, asi como, los indicadores de la presencia de
interrupción. Enseguida se muestran sus bits:
GIE PEIE T0IE INTE RBIE T0IF INTF RBIF
bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
GIE: Habilitador global de las interrupciones
1: Habilitado
0: Deshabilitado
PEIE: Habilitador de interrupción de los periféricos
1: Habilitado
0: Deshabilitado
T0IE: Interrupción por desbordamiento del TIMER0
1: Habilitado
0: Deshabilitado
INTE: Interrupción externa del pin RB0/INT
1: Habilitado
0: Deshabilitado
RBIE: Interrupción por variación del valor de los bits <RB4:RB7>
1: Habilitado
0: Deshabilitado
T0IF: Indicador de interrupción de desbordamiento del TIMER0
1: Activado
0: Desactivado
INTF: Indicador de interrupción del pin RB0/INT
1: Activado
0: desactiva
RBIF: Indicador de interrupción por variación del valor de los bits <RB4:RB7>
1: Activado
0: Desactivado
[Link] El registro EECON1
El registro de configuración 1 de la memoria EEPROM es de 8 bits y contiene los bits
que permiten la configuración, habilitación y puesta en marcha del proceso de lectura
o escritura de dicha memoria. Abajo se muestran sus bits:
- - - EEIF WRWRR WREN WR RD
bit7 bit6 bit5 bit4 bit3 bit2 bit1 Bit0
EEIF: Indicador de proceso de escritura
1: Escritura culminada
0: Escritura desactivada o en proceso
WRERR: Indicador de error del proceso de escritura
1: Proceso finalizado prematuramente debido a un reset o watchdoog
0: Proceso correcto
CIBERTEC CARRERAS PROFESIONALES
90
WREN: Habilitador del proceso de escritura
1: Habilitado
0: Deshabilitado
WR: Control de inicialización de la escritura e indicador de proceso culminado
1: Inicia el proceso de escritura
0: Indica el fin del proceso de escritura
RD: Control de inicialización de la lectura e indicador de proceso culminado
1: Inicia el proceso de lectura
0: Indica el fin del proceso de lectura
[Link] El registro EECON2
El registro de configuración 2 de la memoria EEPROM es de 8 bits y sólo sirve para
secuenciar la operación de escritura sobre esta memoria. Este registro debe recibir
consecutivamente dos valores, primero se le debe transferir el valor 55h y luego el
valor AAh. Realizado esto, ya se puede iniciar el proceso de escritura sobre la
EEPROM.
[Link] El registro PORTA
El registro de puerto A esta formado por 6 bits y contiene los 6 primeros pines de
comunicación con los elementos externos al Microcontrolador. Veamos sus bits:
- - RA5 RA4 RA3 RA2 RA1 RA0
bit7 bit6 bit5 bit4 bit3 bit2 bit1 Bit0
RA0: Bit menos significativo del puerto. Funciona como I/O digital o in análoga 0.
RA1: Funciona como I/O digital o entrada análoga 1.
RA2: Funciona como I/O digital o entrada análoga 2.
RA3: Funciona como I/O digital o entrada análoga 3 o VREF.
RA4: Funciona como I/O digital o entrada de fuente externa de reloj para el TMR0.
RA5: Bit mas significativo del puerto. Funciona como I/O o selector del puerto serie
esclavo síncrono de entrada o entrada análoga 4.
[Link] El registro PORTB
El registro de puerto B esta formado por 8 bits y contiene los 8 siguientes pines de
comunicación con los elementos externos al Microcontrolador. Veamos sus bits:
RB7 RB6 RB5 RB4 RB3 RB2 RB1 RB0
bit7 bit6 bit5 bit4 bit3 bit2 Bit1 Bit0
RB0: Bit menos significativo. Funciona como I/O digital o interrupción por pulso bajo.
RB1: Funciona como I/O digital.
RB2: Funciona como I/O digital.
RB3: Funciona como I/O digital.
RB4: Funciona como I/O digital o interrupción si varía su valor.
RB5 Funciona como I/O digital o interrupción si varía su valor.
RB6 Funciona como I/O digital o interrupción si varía su valor.
RB7 Bit mas significativo. Funciona como I/O o interrupción si varía su valor.
[Link] El registro PORTC
El registro de puerto C esta formado por 8 bits y contiene los 8 siguientes pines de
comunicación con los elementos externos al Microcontrolador. Veamos sus bits:
CARRERAS PROFESIONALES CIBERTEC
MICROCONTROLADORES
91
RC7 RC6 RC5 RC4 RC3 RC2 RC1 RC0
bit7 bit6 bit5 bit4 bit3 bit2 Bit1 Bit0
RC0: Bit menos significativo. Funciona como I/O digital o entrada de reloj para TMT1.
RC1: Funciona como I/O digital o captura 2 in/compare 2 out/pwm2 out.
RC2: Funciona como I/O digital o captura 1 in/compare 1 out/pwm1 out.
RC3: Funciona como I/O digital o reloj de sincronismo serie para SPI o I²C.
RC4: Funciona como I/O digital o dato in para SPI o I/O para I²C.
RC5 Funciona como I/O digital o sincronismo del puerto serie en salida de datos.
RC6 Funciona como I/O digital o transmisión asíncrona USART/reloj síncrono.
RC7 Bit mas significativo. Funciona como I/O o recepción USART/data síncrona.
[Link] El registro PORTD
El registro de puerto D está formado por 8 bits y contiene los 8 siguientes pines de
comunicación con los elementos externos al Microcontrolador. Veamos sus bits:
RD7 RD6 RD5 RD4 RD3 RD2 RD1 RD0
Bit7 bit6 bit5 bit4 bit3 bit2 Bit1 Bit0
RD0: Bit menos significativo. Funciona como I/O digital o puerto paralelo esclavo 0
RD1: Funciona como I/O digital o puerto paralelo esclavo 1.
RD2: Funciona como I/O digital o puerto paralelo esclavo 2.
RD3: Funciona como I/O digital o puerto paralelo esclavo 3.
RD4: Funciona como I/O digital o puerto paralelo esclavo 4.
RD5 Funciona como I/O digital o puerto paralelo esclavo 5.
RD6 Funciona como I/O digital o puerto paralelo esclavo 6.
RD7 Bit mas significativo. Funciona como I/O o puerto paralelo esclavo 7.
[Link] El registro PORTE
El registro de puerto E está formado por 3 bits y contiene los 3 siguientes pines de
comunicación con los elementos externos al Microcontrolador. Veamos sus bits:
- - - - - RE2 RE1 RE0
- - - - - bit2 Bit1 Bit0
RE0: Bit menos significativo. Funciona como I/O digital o control de lectura en el
modo puerto esclavo paralelo o entrada análoga 5.
RE1: Funciona como I/O digital o control de escritura en el modo puerto esclavo
paralelo o entrada análoga 6. .
RE2: Funciona como I/O digital o habilitador del chip en el modo puerto esclavo
paralelo o entrada análoga 7.
[Link] El registro TRISA
El registro de configuración del sentido de trabajo está formado por 6 bits y establece
si cada pin del PUERTO A trabajará como entrada o salida. Veamos sus bits:
- - TRISA5 TRISA4 TRISA3 TRISA2 TRISA1 TRISA0
bit7 bit6 bit5 bit4 bit3 bit2 bit1 Bit0
TRISA0: Bit de configuración del pin RA0.
TRISA1: Bit de configuración del pin RA1.
TRISA2: Bit de configuración del pin RA2.
TRISA3: Bit de configuración del pin RA3.
CIBERTEC CARRERAS PROFESIONALES
92
TRISA4: Bit de configuración del pin RA4.
TRISA5: Bit de configuración del pin RA5.
[Link] El registro TRISB
El registro de configuración del sentido de trabajo está formado por 8 bits y establece
si cada pin del PUERTO B trabajará como entrada o salida. Veamos sus bits:
TRISB7 TRISB6 TRISB5 TRISB4 TRISB3 TRISB2 TRISB1 TRISB0
bit7 bit6 bit5 bit4 bit3 bit2 bit1 Bit0
TRISB0: Bit de configuración del pin RB0.
TRISB1: Bit de configuración del pin RB1.
TRISB2: Bit de configuración del pin RB2.
TRISB3: Bit de configuración del pin RB3.
TRISB4: Bit de configuración del pin RB4.
TRISB5: Bit de configuración del pin RB5.
TRISB6: Bit de configuración del pin RB6.
TRISB7: Bit de configuración del pin RB7.
[Link] El registro TRISC
El registro de configuración del sentido de trabajo está formado por 8 bits y establece
si cada pin del PUERTO C trabajará como entrada o salida. Veamos sus bits:
TRISC7 TRISC6 TRISC5 TRISBC TRISBC TRISBC TRISBC TRISC0
bit7 bit6 bit5 bit4 bit3 bit2 bit1 Bit0
TRISC0: Bit de configuración del pin RC0.
TRISC1: Bit de configuración del pin RC1.
TRISC2: Bit de configuración del pin RC2.
TRISC3: Bit de configuración del pin RC3.
TRISC4: Bit de configuración del pin RC4.
TRISC5: Bit de configuración del pin RC5.
TRISC6: Bit de configuración del pin RC6.
TRISC7: Bit de configuración del pin RC7.
[Link] El registro TRISD
El registro de configuración del sentido de trabajo está formado por 8 bits y establece
si cada pin del PUERTO D trabajará como entrada o salida. Veamos sus bits:
TRISD7 TRISD6 TRISD5 TRISD4 TRISD3 TRISD2 TRISD1 TRISD0
bit7 bit6 bit5 bit4 bit3 bit2 bit1 Bit0
TRISD0: Bit de configuración del pin RB0.
TRISD1: Bit de configuración del pin RD1.
TRISD2: Bit de configuración del pin RD2.
TRISD3: Bit de configuración del pin RD3.
TRISD4: Bit de configuración del pin RD4.
TRISD5: Bit de configuración del pin RD5.
TRISD6: Bit de configuración del pin RD6.
TRISD7: Bit de configuración del pin RD7.
[Link] El registro TRISE
El registro de configuración del sentido de trabajo está formado por 8 bits y establece
si cada pin del PUERTO E trabajará como entrada o salida. Veamos sus bits:
CARRERAS PROFESIONALES CIBERTEC
MICROCONTROLADORES
93
- - - - - TRISE2 TRISE1 TRISE0
bit2 bit1 Bit0
TRISE0: Bit de configuración del pin RE0.
TRISE1: Bit de configuración del pin RE1.
TRISE2: Bit de configuración del pin RE2.
Cada bit puede de los cinco puertos puede ser configurado independientemente o en
grupo según se requiera. Si el bit TRISXy es fijado a cero (0), su pin correspondiente
en el PORTXy (RXy) queda configurado como salida. Por el contrario, si fijamos su
valor a uno (1) el pin correspondiente en RXy quedaría configurado como entrada.
[Link] El registro PIE1
El registro de interrupción de periféricos 1, contiene la habilitación individual de
interrupción de los primeros periféricos. Es necesario fijar a 1 el bit relacionado con la
función de interrupción que deseamos habilitar.
PSPIE1 ADIE RCIE TXIE SSPIE CCP1IE TMR2IE TMR1IE
bit7 bit6 bit5 bit4 bit3 bit2 bit1 Bit0
PSPIE : Lectura/escritura del puerto paralelo esclavo
0: Deshabilitado
1: Habilitado
ADIE : Conversión análoga digital
0: Deshabilitado
1: Habilitado
RCIE: USART recepción
0: Deshabilitado
1: Habilitado
TXIE: USART transmisión
0: Deshabilitado
1: Habilitado
SSPIE: Puerto serial síncrono
0: Deshabilitado
1: Habilitado
CCP1IE: Modulo de captura comparación y fase 1
0: Deshabilitado
1: Habilitado
TMR2IE: Igualdad del timer2 con el registro PR2
0: Deshabilitado
1: Habilitado
TMR1IE: Desbordamiento del TMR1
0: Deshabilitado
1: Habilitado
CIBERTEC CARRERAS PROFESIONALES
94
[Link] El registro PIR1
El registro indicador de estado de periféricos 1 contiene los flags de interrupción de los
primeros periféricos. Estos indicadores se fijan automáticamente a 1 cada vez que su
proceso relacionado se ha completado.
PSPIF ADIF RCIF TXIF SSPIF CCP1IF TMR2IF TMR1IF
bit7 bit6 bit5 bit4 bit3 bit2 bit1 Bit0
PSPIF: Lectura/escritura del puerto paralelo esclavo
1: Una operación de lectura o escritura ha culminado
0: Lectura o escritura en proceso
ADIF: Conversión análoga digital
1: Una operación de conversión ha culminado
0: Conversión aun sin completar
RCIF: USART recepción
1: El buffer de recepción USART esta lleno
0: Buffer aun por llenar
TXIF: USART transmisión
1: El buffer de transmisión USART esta vació
0: Buffer aun por vaciar
SSPIF: Puerto serial síncrono
1: Una transmisión o recepción completa ha tenido lugar
0: Transmisión o recepción aun por procesar
CCP1IF: Modulo de captura comparación y fase 1
1: Una operación de captura o comparación del timer 1 ha ocurrido
Esta ocurrencia resetea al timer 1
0: Aun no ha ocurrido el proceso
TMR2IF: Igualdad del timer2 con el registro PR2
1: La igualdad del timer 2 y del registro PR2 se dio
0: Tal igualdad aun no se da
TMR1IF: Desbordamiento del timer 1
1: El timer uno se ha desbordado
0: El desbordamiento aun no sucede
[Link] El registro PIE2
El registro de interrupción periféricos 2 tiene la habilitación de interrupción de los
periféricos faltantes. Es necesario fijar a 1 el bit relacionado con la función de
interrupción que deseamos habilitar.
- - - EEIE BCLIE - - CCP2IE
bit7 bit6 bit5 bit4 bit3 bit2 Bit1 Bit0
EEIE: Escritura de la EEPROM
0: Deshabilitado
1: Habilitado
CARRERAS PROFESIONALES CIBERTEC
MICROCONTROLADORES
95
BCLIE: Colisión de bus generado por el puerto serial síncrono
0: Deshabilitado
1: Habilitado
CCP2IE: Modulo de captura, comparación y fase 2
0: Deshabilitado
1: Habilitado
[Link] El registro PIR2
El registro indicador de estado de periféricos 2 tiene los indicadores de los periféricos
restantes. Estos indicadores se fijan automáticamente a 1 cada vez que su proceso
relacionado se ha completado.
- - - EEIF BCLIF - - CCP2IF
Bit7 bit6 bit5 bit4 bit3 bit2 Bit1 Bit0
EEIF: Escritura de la EEPROM
1: El proceso de escritura ha culminado
0: La escritura aun no termina
BCLIF: Colisión de bus generado por el puerto serial síncrono
1: Colisión de bus generada
0: No hay colisión
CCP2IF: Modulo de captura, comparación y fase 2
1: Una operación de captura o comparación del timer 1 ha ocurrido.
Esta ocurrencia resetea al timer 1 y genera un proceso de conversión
análoga digital si el modulo de conversión esta habilitada.
0: No ha ocurrido aún el proceso
[Link] El registro T1CON
El registro de control del TMR1, contiene los bits de habilitación, configuración y factor
de división para el timer1.
- - T1CKPS1 T1CKPS0 T1OSCEN T1SYNC TMR1CS TMR1ON
Bit7 bit6 bit5 bit4 bit3 bit2 Bit1 Bit0
T1CKPS1- T1CKPS0: Selector del factor de división
PS1 PS0 TIMR1
0 0 1
0 1 2
1 0 4
1 1 8
T1OSCEN: Oscilador externo
1: Habilitado
0: Deshabilitado
T1SYNC: Sincronización de entrada del oscilador externo
0: Habilitada
1: Desactivada
TMR1CS: Elección de la fuente de reloj
CIBERTEC CARRERAS PROFESIONALES
96
1: Externa a través del pin RC0/T1OSO/T1CKI
0: Interna (F/4)
TMR1ON: Puesta en marcha del timer
1: Activada
0: Desactivada
[Link] El registro T2CON
El registro de control del TMR2, contiene los bits de habilitación, configuración y factor
de división para el timer2.
- TOUTPS3 TOUTPS2 TOUTPS1 TOUTPS0 TMR2ON T2CKPS1 T2CKPS0
Bit7 Bit6 bit5 bit4 bit3 bit2 Bit1 Bit0
TOUTPSX: Selector del factor de post división
TOPS3 S2 S1 S0 POST TMR2
0 0 0 0 1
0 0 0 1 2
0 0 1 0 3
0 0 1 1 4
0 1 0 0 5
. .
. .
. .
1 1 1 1 16
TMR2ON: Puesta en marcha del timer
1: Activada
0: Desactivada
T2CKPSX: Selector del factor de división
T2CKPS1 PS0 TMR2
0 0 1
0 1 4
1 0 16
1 1 16
[Link] El registro TXSTA
El registro de control de transmisión y estado serie, muestra el estado y permite el
control de la transmisión de datos seriales.
CSRC TX9 TXEN SYNC - BRGH TRMT TX9D
Bit7 bit6 bit5 bit4 bit3 bit2 Bit1 Bit0
CSRC: Selector de la fuente de clock en modo síncrono
0: clock externo
1: clock interno
TX9: Habilitador de transmisión del noveno bit
CARRERAS PROFESIONALES CIBERTEC
MICROCONTROLADORES
97
0: desactivado
1: activado
TXEN: Habilitador de la transmisión
0: desactivado
1: activado
SYNC: Selector del modo de trabajo
0: Asíncrono
1: Síncrono
BRGH: Selector de velocidad en modo asíncrono
0: baja
1: alta
TRMT: Estado del registro de desplazamiento de transmisión
0: En proceso de transmisión
1: vació
TX9D: Noveno bit de dato a transmitir
[Link] El registro RCSTA
El registro de control de recepción y estado serie, muestra el estado y permite el
control de la recepción de datos seriales.
SPEN RX9 SREN CREN ADDEN FERR OERR RX9D
Bit7 bit6 bit5 bit4 bit3 bit2 Bit1 Bit0
SPEN: Habilitador del puerto serial
0: desactivado
1: activado
RX9: Habilitador del noveno bit a recibir
0: desactivado
1: activado
SREN: Habilitador de recepción simple en el modo síncrono maestro
0: deshabilitado
1: habilitado
CREN: Habilitador de recepción continua en modo síncrono asíncrono
0: desactivado
1: activado
ADDEN: Habilitador del detector de dirección
0: desactivado
1: activado
FERR: Indicador de error de trama
0: off
1: on
OERR: Indicador de error de sobrecorrimiento
CIBERTEC CARRERAS PROFESIONALES
98
0: off
1: on
RX9D: Noveno bit de dato a recibir
[Link] El registro ADCON0
El registro de control 0 de conversión A/D, contiene los bits de habilitación, selección,
puesta en marcha y estado de la conversión análoga digital.
ADCS1 ADCS0 CHS2 CH1 CH0 GO/DONE - ADON
Bit7 bit6 bit5 bit4 bit3 bit2 Bit1 Bit0
ADCSX: Selección del clock de conversión
ADCS1 S0 CLOCK
0 0 F/2
0 1 F/8
1 0 F/32
1 1 FRC
CHSX: Selección del canal de conversión
CHS2 S1 S0 CANAL
0 0 0 0 (RA0)
0 0 1 1 (RA1)
0 1 0 2 (RA2)
0 1 1 3 (RA3)
1 0 0 4 (RA5)
1 0 1 5 (RE0)
1 1 0 6 (RE1)
1 1 1 7 (RE2)
GO/DONE: Estado de la conversión
1: En progreso
0: Culminó la conversión
ADON: Puesta en marcha de la conversión.
1: Activada
0: Desactivada
[Link] El registro ADCON1
El registro de control 1 de conversión A/D, contiene los bits de formato de conversión y
la configuración de los puertos digitales y análogos.
ADFM - - - PCFG3 PCFG2 PCFG1 PCFG0
Bit7 bit6 bit5 bit4 Bit3 bit2 Bit1 Bit0
ADFM: Formato del resultado de conversión
0: Justificado a la izquierda (8 bits ADRESH y 2 bits ADRESL)
1: justificado a la derecha (2 bits ADRESH y 8 bits ADRESL)
PCFGX: Configuración de los puertos análogos y digitales
CARRERAS PROFESIONALES CIBERTEC
MICROCONTROLADORES
99
PCFG3: AN7 AN6 AN5 AN4 AN3 AN2 AN1 AN0
VREF+ VREF-
PCFG0 RE2 RE1 RE0 RA5 RA3 RA2 RA1 RA0
0000 A A A A A A A A VDD GND
0001 A A A A - A A A RA3 GND
0010 D D D A A A A A VDD GND
0011 D D D A - A A A RA3 GND
0100 D D D D A D A A VDD GND
0101 D D D D - D A A RA3 GND
0110 D D D D D D D D - -
0111 D D D D D D D D - -
1000 A A A A - - A A RA3 RA2
1001 D D A A A A A A VDD GND
1010 D D A A - A A A RA3 GND
1011 D D A A - - A A RA3 RA2
1100 D D D A - - A A RA3 RA2
1101 D D D D - - A A RA3 RA2
1110 D D D D D D D A VDD GND
1111 D D D D - - D A RA3 RA2
La manipulación de los bits de todos estos registros especiales, se hará necesario
cada vez que se configuren y utilicen los puertos, temporizadores, comunicación serial,
acceso a la eeprom y canales de conversión análoga digital.
CIBERTEC CARRERAS PROFESIONALES
100
Resumen
La memoria FLASH sirve para almacenar las instrucciones del programa. En esta
se insertan las del programa principal y las de las subrutinas de interrupción. El
registro encargado de direccionar estas instrucciones es el PC. Cada vez que
aparece un reset el PC recibe la dirección 0000h para ejecutar la primera
instrucción. Y cada vez que algún dispositivo interrumpe, el PC direcciona el vector
de interrupción 0004h.
La memoria RAM está organizada por cuatro bancos, el banco 0, banco 1, el
banco 2 y el banco 3. En los primeros espacios de memoria están contenidos los
registros especiales de configuración y funciones del PIC. Mientras que, los demás
espacios están reservados para el tratamiento de los datos y variables.
La selección de los Bancos se debe realizar cada vez que necesitamos manipular
algún registro especial o alguna de las celdas de RAM. Esta selección se realiza a
través de dos bits: RP1 y RP0 del registro STATUS.
Los registros de los puertos PORTA, PORTB, PORTC, PORTD y PORTE son los
encargados de comunicarse con los dispositivos externos, mientras que, los
registros TRISA, TRISB, TRISC, TRISD y TRISE son los encargados de configurar
el sentido de trabajo de los puertos.
Los registros INTCON, PIE1, PIE2, PIR1 y PIR2 son los encargados de habilitar las
fuentes de interrupción e indicar la presencia de sus interrupciones.
Los registros OPTION, T1CON y T2CON son los encargados de configurar y poner
en marcha el funcionamiento de los timers TMR0, TMR1 y TMR2.
Los registros TXSTA y RCSTA son los encargados de configurar la comunicación
serial tipo USART.
Los registros ADCON0 y ADCON1 son los registros encargados de configurar la
conversión análoga digital.
Si desea saber más acerca de estos temas, puede consultar las siguientes
páginas.
8[Link]
n%20de%20la%[Link]
Aquí hallará información sobre la memoria FLASH, los bancos de RAM y
registros.
CARRERAS PROFESIONALES CIBERTEC
MICROCONTROLADORES
101
UNIDAD DE
APRENDIZAJE
5
SEMANA
11
PROGRAMACIÓN DEL PIC16F877
LOGRO DE LA UNIDAD DE APRENDIZAJE
Al terminar la unidad, los alumnos podrán implementar circuitos aplicativos
basados en el PIC16F877. La polarización, reset, oscilación y los dispositivos de
salida se adaptarán al microcontrolador sin ningún tipo de.
Al terminar la unidad, los alumnos podrán desarrollar programas que pongan en
marcha el funcionamiento de circuitos aplicativos basados en el PIC16F877. Los
programas se realizarán en el computador, se transferirán al microcontrolador y
dejarán operativos al 100% la configuración y por lo menos al 80% la función
propuesta para la aplicación.
TEMARIO
Juegos de instrucciones
Acceso a los puertos
Acceso a la memoria RAM
Desarrollo de programas
ACTIVIDADES PROPUESTAS
Los alumnos conectan los dispositivos al PIC.
Los alumnos configuran el sentido de trabajo de los puertos.
Los alumnos leen y escriben información sobre los puertos.
Los alumnos acceden de modo directo e indirecto a la memoria RAM.
CIBERTEC CARRERAS PROFESIONALES
102
1. JUEGO DE INSTRUCCIONES
El PIC16F877 al igual que el PIC16F84 posee 35 instrucciones. A continuación se
describen:
La letra d indica el destino de la operación, si d = 0 el destino de la
Orientadas al BYTE operación es el registro de trabajo W, pero si d = 1 el destino será el
elemento F (registro especial, celda de ram o variable).
ADDWF F,d Suma el registro W y F
ANDWF F,d And lógico entre W y F
CLRF F Borra todos los bits de F
CLRW Borra todos los bits de W
COMF F,d Complementa el valor de F
DECF F,d Disminuye en uno el valor de F
DECFSZ F,d Disminuye en uno el valor de F y salta si se hizo cero
INCF F,d Aumenta en uno el valor de F
INCFSZ F,d Aumenta en uno el valor de F y salta si se hizo cero
IORWF F,d Or lógico entre W y F
MOVFW F Transfiere el valor de F a W
MOVWF F Transfiere el valor del registro W a F
NOP Ninguna operación, sólo consume un ciclo de máquina
RLF F,d Rota hacia la izquierda un bit F a través del Carry
RRF F,d Rota hacia la derecha un bit F a través del Carry
SUBWF F,d Resta el registro W de F
SWAPF F,d Intercambia los nibbles de F
XORWF F,d Xor lógico entre W y F
Ejemplos:
ADDWF PORTD,1 ; PORTD = W + PORTD
ADDWF PORTD,0 ; W = W + PORTD
CLRF PORTC ; PORTC = 0 (todos sus bits)
CLRF TRISA ; TRISA = 0 (todos sus bits)
CLRW ; W = 0 (todos sus bits)
DECF VALOR ; VALOR = VALOR – 1
INCF VARIABLE ; VARIABLE = VARIABLE + 1
MOVFW PORTE ; W = PORTE
MOVWF INDF ; INDF = W
SUBWF MAXIMO,1 ; MAXIMO = MAXIMO – W
SUBWF MAXIMO,0 ; W = MAXIMO - W
La letra b indica el bit a manipular del elemento F (registro especial,
celda de ram o variable). Si el bit tiene nombre se colocará su
Orientadas al BIT
nombre en la posición b, de lo contrario, tendrá que indicarse la
posición que ocupa el bit dentro del elemento F.
BCF F,b Pone a cero (0) el bit b del elemento F
BSF F,b Pone a uno (1) el bit b del elemento F
BTFSC F,b Salta si el bit b de F está en cero
BTFSS F,b Salta si el bit b de F está en uno
Ejemplos:
CARRERAS PROFESIONALES CIBERTEC
MICROCONTROLADORES
103
BCF STATUS,RP1 ; Pone a cero (0) el bit RP1 del registro STATUS
BSF PORTE,0 ; Pone a uno (1) el bit menos significativo del PUERTO E.
BCF TRISC,2 ; Pone a cero el tercer bit del registro TRISC.
BSF EEDAT,7 ; Pone a uno el bit mas significativo del registro EEDAT.
BTFSC PORTD,0 ; Salta si el bit menos significativo del PUERTO D es cero.
BTFSS PORTB,4 ; Salta si el bit mas significativo del PUERTO B es uno.
La letra K es el operando constante que puede tomar cualquier valor
numérico o literal comprendido entre 0 y 255, este valor puede ser
Constantes y control
expresado en decimal, hexadecimal o binario. El destino de todas
las operaciones donde interviene K es el registro W.
ADDLW K Suma W mas K
ANDLW K AND lógica entre W y K
CALL ETIQUETA Se llama a ejecución la subrutina cuya dirección lo indica ETIQUETA
CLRWDT Borra el temporizado de la función watchdog
GOTO K Salta a la dirección indicada en la ETIQUETA
IORLW K OR lógico entre W y K
MOVLW K Transfiere a W el valor de K
RETFIE Retorno de una subrutina de interrupción.
RETLW K Retorno de una subrutina común cargando una constante en W
RETURN Retorno de una subrutina común
SLEEP Ingreso al modo de descanso
SUBLW K Resta a K, W
XORLW K Xor lógico entre W y K
Ejemplos:
ADDLW .200 ; W = W + 200 (decimal)
ADDLW 0XA6 ; W = W + A6h (hexadecimal)
ADDLW B’00110000’ ; W = W + 00110000b (binario)
ANDLW B’11011101’ ; W = W . 11011101b
CALL TEMP ; Invoca la ejecución de la función TEMP.
GOTO NEW ; Salta a la etiqueta NEW
MOVLW 0XB8; W = B8h
RETLW .25 ; Retorna de una subrutina y transfiere el valor 25 a W
RETLW 0XF1 ; Retorna de una subrutina y transfiere el valor F1h a W
SUBLW .5 ;W=5–W
1.1 Acceso a los puertos
Sabemos que se dispone de los puertos A, B, C, D y E para comunicar al PIC con
cualquier elemento externo y no es suficiente conectar los dispositivos a estos puertos
para que empiecen a funcionar.
1.1.1 Configuración de los puertos
Es necesario indicarle al Microcontrolador el sentido de trabajo de los elementos que
hemos conectado a sus puertos, de no hacerlo, en el mejor de los casos nuestro
sistema no funcionaría bien y en el peor de los casos quemaríamos algunos bits de los
puertos.
[Link] Entradas o salidas
CIBERTEC CARRERAS PROFESIONALES
104
Al igual que los puertos del PIC16F84, cada pin de los puertos del PIC16F877, es
configurable independientemente y sólo puede trabajar en un solo sentido, como
entrada o salida. La configuración se realiza a través de los registros TRISX. Donde
TRISA configura al PUERTO A, TRISB configura al PUERTO B, TRISC configura al
PUERTO C, TRISD configura al PUERTO D y TRISE configura al PUERTO E.
Un cero sobre los bits de los registros TRISX configura como salida los pines
relacionados en los PUERTOS, mientras que, un uno deja configurado como entrada
los pines relacionados en los PUERTOS.
[Link] Ejemplos de configuración
Considere que el puerto D tiene conectado leds y switches según el siguiente
esquema:
El registro de configuración a manipular sería TRISD y sus bits deberían verse según
el siguiente esquema:
Para lograr esto, utilizamos las siguientes instrucciones:
BCF TRISD,0 ;OUT (LED)
BCF TRISD,1 ;OUT (LED)
BSF TRISD,2 ;IN (SWITCH)
BCF TRISD,3 ;OUT (LED)
BSF TRISD,4 ;IN (SWITCH)
O si se quiere, en dos instrucciones:
MOVLW B’00010100’
MOVWF TRISD
Supongamos ahora que al PUERTO C se le ha conectado un relé, leds, un switch, un
sensor óptico y un pulsador según el siguiente esquema:
El registro de configuración a manipular sería TRISC y sus bits deberían verse según
el esquema siguiente:
Para lograr esto, utilizamos las siguientes instrucciones:
BSF TRISC,0 ;IN (PULSADOR)
BCF TRISC,1 ;OUT (LED)
BCF TRISC,2 ;OUT (LED)
BCF TRISC,3 ;OUT (LED)
CARRERAS PROFESIONALES CIBERTEC
MICROCONTROLADORES
105
BSF TRISC,4 ;IN (SENSOR)
BSF TRISC,5 ;IN (SWITCH)
BCF TRISC,6 ;OUT (LED)
BSF TRISC,7 ;IN (RELE)
Si deseamos hacer lo mismo en dos instrucciones:
MOVLW B’10110001’
MOVWF TRISC
1.1.4 Selección de los bancos
Antes de manipular los bits de cualquier registro, debemos asegurar que nos
encontramos en el banco al que pertenece este registro, y para ello debemos
seleccionar el banco adecuado utilizando los bits RP0 y RP1 del registro STATUS.
Recordemos que cada combinación de estos bits selecciona un banco distinto, tal
como se muestra en la siguiente tabla:
RP1 RP0 BANCO
0 0 0
0 1 1
1 0 2
1 1 3
Las instrucciones relacionadas serían:
BCF STATUS,RP0 ; RP0 = 0
BCF STATUS,RP1 ; RP1 = 0
BSF STATUS,RP0 ; RP0 = 1
BSF STATUS,RP1 ; RP1 = 1
Recordemos que los registros de configuración TRISX se encuentran ubicados en el
banco 1, por lo tanto, la configuración adecuada para los dos casos anteriores de
conexión serían:
Para la configuración del PUERTO D:
BSF STATUS,RP0 ;Selección del
BCF STATUS,RP1 ; banco 1
BCF TRISD,0 ;OUT (LED)
BCF TRISD,1 ;OUT (LED)
BSF TRISD,2 ;IN (SWITCH)
BCF TRISD,3 ;OUT (LED)
BSF TRISD,4 ;IN (SWITCH)
Para la configuración del PUERTO C:
BSF STATUS,RP0 ;Selección del
BCF STATUS,RP1 ; banco 1
BSF TRISC,0 ;IN (PULSADOR)
BCF TRISC,1 ;OUT (LED)
BCF TRISC,2 ;OUT (LED)
BCF TRISC,3 ;OUT (LED)
BSF TRISC,4 ;IN (SENSOR)
BSF TRISC,5 ;IN (SWITCH)
BCF TRISC,6 ;OUT (LED)
BSF TRISC,7 ;IN (RELE)
1.1.2 Lectura y escritura de los puertos
CIBERTEC CARRERAS PROFESIONALES
106
Llegado a este punto estamos listos para comunicar al Microcontrolador con los
dispositivos externos.
[Link] Lectura
Leer significa obtener información de los puertos, es decir saber en que estado se
encuentran los dispositivos de entrada y para esto disponemos de dos tipos de
instrucción, la que está orientada al byte (MOVFW) y las que están orientadas al BIT
(BTFSC y BTFSS). Si se desea capturar la información de varios bits de un puerto al
mismo tiempo, será necesario utilizar MOVFW, pero, si se desea saber el estado de un
solo bit, conviene utilizar BTFSC o BTFSS.
Si tuviésemos un teclado conectado al Microcontrolador, tal
como se muestra en el esquema de la derecha, sería
necesario utilizar la instrucción MOVFW F, porque el teclado
tiene varios bits.
Cada vez que necesitemos leer el teclado utilizaríamos
MOVFW PORTD, con lo cual, la información obtenida del
teclado se transferiría sobre el registro de trabajo W. ¿Qué
hacer con la información obtenida del teclado?, eso dependerá de la aplicación
planteada, lo cual, obviamente involucrará la manipulación del registro W, ya que, este
registro es el que recibe la información.
Si tuviéramos un pulsador, switch o sensor óptico conectado a
alguna de las entradas de los ports y querríamos averiguar en que
estado se encuentra este, estaríamos obligados a utilizar las
instrucciones BTFSC o BTFSS. Si se requiere saber que el pulsador
está en 0 usaremos la instrucción, para este caso, BTFSC
PORTC,4. Pero, si es requerido saber que este pulsador se
encuentra en 1, utilizaremos la instrucción BTFSS PORTC,4. ¿Qué
hacer si el pulsador estuvo en cero o uno?, dependerá nuevamente de las condiciones
de la aplicación implementada.
Recordemos que los puertos se encuentran ubicados en el banco 0 de la memoria
RAM y por lo tanto, es necesario seleccionar el banco 0 antes de manipular algún bit
de los puertos.
Las instrucciones incluida la selección del Banco sería:
BCF STATUS,RP0 ;Selección del
BCF STATUS,RP1 ; banco 0
MOVFW PORTD ;W = PORTD = TECLADO
BCF STATUS,RP0 ;Selección del
BCF STATUS,RP1 ; banco 0
BTFSC PORTC,4 ;Salta si RC4 es 0
[Link] Escritura
Escribir significa enviar información hacia los puertos, es decir fijar a 0 ó 1 los bits de
los dispositivos de salida y para esto disponemos de dos tipos de instrucción, la que
está orientada al byte (MOVWF) y las que están orientadas al BIT (BCF y BSF). Si se
desea fijar el estado de varios bits de un puerto al mismo tiempo, será necesario
utilizar MOVWF, pero, si se desea manipular el estado de un solo bit, conviene utilizar
BCF o BSF según sea el estado que deseamos fijar.
CARRERAS PROFESIONALES CIBERTEC
MICROCONTROLADORES
107
Si tenemos un display de 7 segmentos conectado uno de los
puertos, sería necesario manipular varios bits al mismo tiempo y
por lo tanto, la instrucción conveniente sería MOVWF F.
Supóngase que se desea apagar el display ánodo común, es
decir, sus segmentos se apagan con unos; las instrucciones a
usar serían: MOVLW B’11111111’ y MOVWF PORTC.
Pero, si en lugar de displays se tiene leds conectados a los puertos,
tal como se muestra en la figura de la derecha, las instrucciones a
utilizar serían BCF y BSF según se requiera. Suponiendo que los
leds se encuentran en conexión normal, es decir, se apagan con 0 y
se encienden con 1. ¿Cuales serían las instrucciones para apagar el
led conectado al puerto E y encender el que está conectado al
puerto D?. Las instrucciones serían: BCF PORTE,1 y BSF PORTD,5
respectivamente.
Pero, nuevamente cualquier manipulación de los puertos no será posible si no
seleccionamos el Banco de memoria que los contiene. Por lo tanto, las instrucciones
incluida la selección de los bancos se vería así:
BCF STATUS,RP0 ;Selección del
BCF STATUS,RP1 ; banco 0
MOVLW B’11111111’ ;W = 11111111b
MOVWF PORTC ;DISPLAY = PORTC = W
BCF STATUS,RP0 ;Selección del
BCF STATUS,RP0 ; banco 0
BCF PORTE,1 ;LED = RE1 = 0
BSF PORTD,5 ;LED = RD5 = 1
Si tuviera el siguiente esquema y le pidieran transferir
constantemente la información del teclado sobre el display, la
instrucción de lectura sería MOVFW F y la de escritura sería
MOVWF F.
Específicamente las instrucciones serían MOVFW PORTC y
MOVWF PORTB.
Tenga en cuenta que, no se selecciona el banco 0 cada vez que se necesitan
manipular los puertos ya sea para leer o escribir en estos. Sólo se realiza la selección,
si el banco de trabajo actual no fuera el que deseamos.
1.2 Acceso a la memoria RAM
Esta memoria sirve para el tratamiento de datos y variables, y se puede acceder a sus
celdas en dos modos: directo e indirecto. Las celdas disponibles van desde la
dirección 20h a 7Fh para el banco 0, desde la A0h a EFh para el banco 1, desde la
110h a la 16Fh para el banco 2 y desde la 190h a la 1EFh para el banco 3. En total
hacen 368 celdas.
1.2.1 Acceso directo
La lectura o escritura de la memoria RAM siempre se realiza
utilizando el registro de trabajo W para la transferencia del dato,
mientras que, el direccionamiento de la celda, se realiza utilizando como operando,
directamente la dirección de la celda o la variable asignada a la dirección.
CIBERTEC CARRERAS PROFESIONALES
108
[Link] Escritura de datos
Si deseamos escribir sobre la memoria utilizando como operando
la dirección de la celda, utilizaríamos la instrucción MOVWF
DIRECCION, donde DIRECCION es cualquier celda desde la 0Ch a la 4Fh.
Por ejemplo, suponga que desea escribir el valor 50 en la celda de memoria 30h.
Primero transferimos el dato 50 al registro W: MOVLW .50, luego, escribimos
(transferimos) en la celda 30h este dato: MOVWF 0X30.
Si en lugar de la dirección, se conoce el nombre de la variable asociada a la celda de
memoria, este toma el lugar del operando DIRECCION, así, la instrucción para la
escritura será: MOVWF VARIABLE, donde obviamente VARIABLE es el nombre de la
dirección de la celda que deseamos manipular. Supongamos que la dirección de la
celda 20h, tiene asociada la variable de nombre CELDA20 y queremos escribir sobre
esta el valor 55h. Empezamos transfiriendo el dato 55h al registro W: MOVLW 0X55,
enseguida, transferiríamos este dato sobre la variable CELDA20 (celda 20h): MOVWF
CELDA20.
CARRERAS PROFESIONALES CIBERTEC
MICROCONTROLADORES
109
[Link] Lectura de datos
Al igual que la escritura, la transferencia de los datos pasan por el
registro W y la dirección será indicada directamente o a través de una variable. La
instrucción asociada a la lectura es MOFW CELDA, donde CELDA es directamente la
dirección de la celda o la variable asociada a la dirección de la celda.
Por ejemplo, la celda de memoria 18h tiene
asociada la variable de nombre STORE y
deseamos leer su contenido para transferirlo por el PORTB. Primero debemos
transferir el contenido de la celda hacia el registro W: MOVFW 0X18 o MOVFW
STORE y segundo, transferir el valor del registro W sobre el PORTB: MOVWF
PORTB.
1.2.2 Acceso indirecto
Si se van a manipular cadenas de datos y por lo tanto la lectura o escritura sobre las
celdas de memoria es consecutiva y repetitiva, se hace necesario utilizar un puntero
que se desplace entre las direcciones consecutivas de la memoria, para facilitar el
acceso. Este puntero es el registro FSR y cada vez que necesitemos almacenar o leer
un bloque de datos de la memoria RAM, este debe apuntar a la primera celda del
espacio a manipular.
Una vez direccionada la memoria ya se puede leer o escribir sobre esta y de eso se
encargan el registro INDF y el registro de trabajo
W. Para escribir en una celda de memoria se
transfiere el valor de W a INDF a través de la
instrucción MOVWF INDF y para leer de una celda
de memoria se transfiere el valor de INDF a W a
través de la instrucción MOVFW INDF.
Los últimos 16 bytes de los banco 1, 2 y 3 sólo
esta mapeado para el acceso desde las
direcciones 70h a 7Fh del banco 0, el resto de
bytes es accesible desde su banco respectivo. En
este modo indirecto, cada banco se selecciona a
través de dos bits: uno es el bit más significativo
del registro FSR (bit 7) y el otro es el bit IRP del
registro STATUS, tal como se muestra en la figura
de la derecha.
[Link] Lectura de datos
Suponga que en la memoria RAM a partir de la celda 20h se encuentra almacenada
una cadena de datos y desea transferirlos uno tras otro por el PORTD. Lo primero es
seleccionar el Banco 0, fijando a 0 el bit IRP del registro STATUS y el bit 7 del registro
FSR, lo segundo es direccionar al inicio de la cadena, en este caso, la dirección 10h
debe ser transferido sobre el registro de direccionamiento
indirecto FSR, lo tercero es leer el dato del registro INDF y
transferirlo por el PORTD y lo cuarto es avanzar a la siguiente
celda de memoria, lo cual se lograría aumentando el valor del
registro FSR. Luego de esto se vuelve a leer el dato y se
transfiere otra vez por el PORTD. Se aumenta la dirección del
registro FSR tantas veces como datos se deseen leer de la
memoria.
CIBERTEC CARRERAS PROFESIONALES
110
En instrucciones sería:
INICIO: BCF STATUS,IRP ; IRP = 0
BCF FSR,7 ; Bit 7 = 0
MOVLW 0X10 ; W = 10h
MOVWF FSR ; FSR = Dirección de inicio de cadena
MOVFW INDF ; W = INDF (DATO de la memoria)
MOVWF PORTB ; PORTB = W = DATO
INCF FSR ; Avanza a la siguiente celda
1.3 Desarrollo de programas
A continuación se propondrán aplicaciones básicas de escritura y lectura de puertos.
Se plantearán circuitos y en base a estos y las condiciones propuestas,
desarrollaremos los programas:
1.2.1 Número del pulsador activado
Realice el programa que indique sobre los leds el número del pulsador que fue
presionado. Es decir, si se activa el pulsador P1, sobre los leds debe aparecer el
número 1, si se activa P2 sobre los leds se observará en número 2, si se activa P3
sobre los leds debe aparecer el número 3 y si se activa el pulsador P4 los leds
beberían representar el número 4.
Empecemos el desarrollo del programa:
CARRERAS PROFESIONALES CIBERTEC
MICROCONTROLADORES
111
ORG 0X0000 ; vector de reset
INICIO BSF STATUS,RP0 ;Selección del banco 1 para
BCF STATUS,RP1 ;configurar el PORT B y D
BSF TRISD,0 ;PORTD,0 = IN (primer pulsador)
BSF TRISD,1 ;PORTD,1 = IN
BSF TRISD,2 ;PORTD,2 = IN
BSF TRISD,3 ;PORTD,3 = IN (cuarto pulsador)
MOVLW 0X00 ;W = 0 = 00000000b
MOVWF TRISB ;TRISB = W : PORTB = OUT (tres leds)
BCF STATUS,RP0 ;selección del banco 0 para
;manipular los puertos
SENSAR BTFSC PORTD,0 ;salta si P1 está desactivado
GOTO MN1 ;salta a MN1 para mostrar el número 1
BTFSC PORTD,1 ;salta si P2 está desactivado
GOTO MN2 ;salta a MN2 para mostrar el número 2
BTFSC PORTD,2 ;salta si P3 está desactivado
GOTO MN3 ;salta a MN3 para mostrar el número 3
BTFSC PORTD,3 ;salta si P4 está desactivado
GOTO MM4 ;salta a MN4 para mostrar el número 4
GOTO SENSAR ;salta a SENSAR nuevamente
MN1 MOVLW 0X01 ;W = 01
MOVWF PORTB ;PORTB = W
GOTO SENSAR ;a sensar los pulsadores
MN2 MOVLW 0X02 ;W = 02
MOVWF PORTB ;PORTB = W
GOTO SENSAR ;a sensar los pulsadores
MN3 MOVLW 0X03 ;W = 03
MOVWF PORTB ;PORTB = W
GOTO SENSAR ;a sensar los pulsadores
MN4 MOVLW 0X04 ;W = 04
MOVWF PORTB ;PORTB = W
GOTO SENSAR ;a sensar los pulsadores
1.2.2 Desplazamiento de iluminación sobre leds
Realice el programa que permita desplazar, una sola vez, el encendido de un led de
izquierda a derecha, cada vez que se active el pulsador P1; pero, si se activa el
pulsador P2, se desplazará el encendido de un led en sentido contrario.
CIBERTEC CARRERAS PROFESIONALES
112
Iniciemos el desarrollo del programa:
VARY EQU 0X40 ;declaración de la variable VARY
VARZ EQU 0X41 ;declaración de la variable VARZ
ORG 0X0000 ; vector reset
INICIO BSF STATUS,RP0 ;selección del
BCF STATUS,RP1 ;banco 1
MOVLW 0X00 ;W=0
MOVWF TRISB ;PORTB OUT (leds)
BSF TRISD,2 ;PORTD,2 IN
BSF TRISD,3 ;PORTD,3 IN
BCF STATUS,RP0 ;selección del banco 0
SENSA BTFSC PORTD,2 ;salta si P1 está desactivado
GOTO DERECHA ;salta a DERECHA para desplazamiento
BTFSC PORTD,3 ;salta si P2 está desactivado
GOTO IZQUIERDA;salta a IZQUIERDA para desplazamiento
GOTO SENSA ;salta a SENSA nuevamente
DERECHA MOVLW B’00001000’ ;W=00001000b
MOVWF PORTB ;PORTB=W (led izquierdo ON)
DESPLAZAD CALL DELAY ;llama y ejecuta retardo de desplazamiento
BCF STATUS,C ;carry = 0
RRF PORTB ;desplaza el led iluminado a la derecha
BTFSS STATUS,C ;salta a FD si acabo desplazamiento
GOTO DESPLAZAD ;salta a DESPLAZAD todavía
FD GOTO SENSA ;salta a SENSA para elegir desplazamiento
CARRERAS PROFESIONALES CIBERTEC
MICROCONTROLADORES
113
IZQUIERDA MOVLW B’00000001’ ;W=00000001b
MOVWF PORTB ;PORTB=W (led derecho ON)
DESPLAZAI CALL DELAY ;llama y ejecuta retardo de desplazamiento
BCF STATUS,C ;carry = 0
RLF PORTB ;desplaza el led iluminado a la izquierda
BTFSS STATUS,C ;salta a FI si acabo desplazamiento
GOTO DESPLAZAD ;salta a DESPLAZAI todavía
FI GOTO SENSA ;salta a SENSA para elegir desplazamiento
DELAY MOVLW 0XFF ;Desarrollo de la subrutina
MOVWF VARY ;de retardo.
IVZ MOVLW 0XFF ;se controla el tiempo
MOVWF VARZ ;de iluminación de cada led
DVZ DECFSZ VARZ
GOTO DVZ
DECFSZ VARY
GOTO IVZ
RETURN ;salida de la subrutina
1.2.3 ON / OFF de un motor de paso
Realice el programa que permita activar y desactivar el giro de un motor de paso.
Cada vez que se active el pulsador P1 el motor empezará a girar y se mantendrá así;
mientras que, cada vez que se active el pulsador P2 el motor detendrá su movimiento
y permanecerá detenido. Los motores de paso giran si colocamos en sus terminales
una secuencia repetitiva de cuatro datos: 1010, 1001, 0101 y 0110. Para que el motor
siga girando se tiene que proveer una y otra vez esta secuencia repetitivamente. El
tiempo que se demore en enviar cada dato de la secuencia, determina la velocidad de
giro.
CIBERTEC CARRERAS PROFESIONALES
114
Iniciemos el desarrollo del programa:
VARY EQU 0X40
VARZ EQU 0X41
ORG 0X0000
INICIO BSF STATUS,RP0
BCF STATUS,RP1
MOVLW 0X00
MOVWF TRISB
BSF TRISC,0
BSF TRISC,1
BCF STATUS,RP0
SENSAP1 BTFSS PORTC,0 ;salta a GIRA si P1 se activó
GOTO SENSAP1 ;salta a SENSAP1
GIRA MOVLW B’00001010’
MOVWF PORTB ;MOTOR=00001010b
CALL DELAY;control de velocidad
MOVLW B’00001001’
MOVWF PORTB ;MOTOR=00001001b
CALL DELAY
MOVLW B’00000101’
MOVWF PORTB ;MOTOR=000000101b
CALL DELAY
MOVLW B’00000110’
MOVWF PORTB ;MOTOR=00000110b
CALL DELAY
GOTO GIRA ;salta a GIRA nuevamente
DELAY MOVLW 0X80 ;Desarrollo del retardo
MOVWF VARY ;que controla la
IVZ MOVLW 0XFF ;velocidad del motor
MOVWF VARZ
DVZ DECFSZ VARZ
GOTO DVZ
DSV DECFSZ VARY
GOTO IVZ
BTFSC PORTC,1 ;salta a CONTINUE si P2 está desactivado
GOTO SENSAP1 ;salta a SENSAP1 porque P2 se activo (off)
CONTINUE RETURN ;salida de la subrutina
CARRERAS PROFESIONALES CIBERTEC
MICROCONTROLADORES
115
1.2.4 Mensaje deslizante sobre un display de cristal líquido
Muestre constantemente sobre el display de cristal líquido el mensaje: CIBERTEC
2009. Este mensaje esta almacenado en la memoria RAM a partir de la dirección 50h.
El mensaje ocupa 13 celdas de memoria, por lo tanto, al acceder a esta las
direcciones variarán desde la 50h hasta la 5Dh. La dirección 5Eh servirá para limitar el
acceso a la memoria.
Empecemos el desarrollo del programa:
VARX EQU0X40 ;declaración de variables para controlar los
VARY EQU0X41 ;tiempos de transmisión de datos sobre el
VARZ EQU0X42 ;display y la velocidad de desplazamiento
DATO EQU0X43 ;variable de datos para el display
ORG 0X0000
INICIO CALL CONFP ;configura los puertos B y D como salidas
CALL FUNSET ;configura el display
CALL ENMSET ;mueve cursor a la derecha por carácter
CALL DCTRL ;activa la visualización
CALL CLRD ;borra cualquier mensaje del display
CALL CHOME ;cursor al inicio de la primera fila
BCF STATUS,IRP ;selección del banco 0 para acceso
BCF FSR,7 ;indirecto de la memoria RAM
MOVLW 0X50 ;W=50h
MOVWF FSR ;FSR = W (dirección de inicio del mensaje)
MOVFW INDF ;W = carácter del mensaje
CALL WDATA ;escribe el carácter en el display
INCF FSR ;pasa a la siguiente dirección del mensaje
CIBERTEC CARRERAS PROFESIONALES
116
BTFSS FSR,3 ;verifica el límite de
GOTO LEERAM ;acceso a la memoria RAM
BTFSS FSR,2 ;5Eh es la dirección límite
GOTO LEERAM ;pero sólo se analisan los unos de la E
BTFSS FSR,1 ;es decir, 1110
GOTO LLERAM ;bits 3, 2 y 1 de FSR
DESPLAZA CALL SHIFT ;desplaza una posición hacia la izquierda
CALL VDESP ;retardo de desplazamiento
GOTO DESPLAZA ;salta a DESPLAZA
;desarrollo de subrutinas
CONFP BSF STATUS,RP0
BCF STATUS,RP1
MOVLW 0X00
MOVWF TRISB
MOVLW 0X00
MOVWF TRISD
BCF STATUS,RP0
RETURN
FUNSET MOVLW b'00111000'
MOVWF DATO
CALL CONFD
RETURN
ENMSET MOVLW b'00000110'
MOVWF DATO
CALL CONFD
RETURN
DCTRL MOVLW b'00001110'
MOVWF DATO
CALL CONFD
RETURN
CLRD MOVLW b'00000001'
MOVWF DATO
CALL CONFD
RETURN
CHOME MOVLW b'00000010'
MOVWF DATO
CALL CONFD
RETURN
SHIFT MOVLW b'00011000'
MOVWF DATO
CALL CONFD
RETURN
CONFD BCF PORTB,1
BCF PORTB,2
CARRERAS PROFESIONALES CIBERTEC
MICROCONTROLADORES
117
CALL DELAY
BSF PORTB,0
CALL DELAY
MOVFW DATO
MOVWF PORTD
CALL DELAY
BCF PORTB,0
CALL DELAY
BSF PORTB,1
BSF PORTB,2
CALL DELAY
RETURN
WDATA MOVWF PORTD
BSF PORTB,2
BCF PORTB,1
CALL DELAY
BSF PORTB,0
CALL DELAY
CALL DELAY
BCF PORTB,0
CALL DELAY
BCF PORTB,2
BSF PORTB,1
CALL DELAY
RETURN
DELAY MOVLW 0X05
MOVWF VARY
IVZ MOVLW 0XFF
MOVWF VARZ
DVZ DECFSZ VARZ
GOTO DVZ
DECFSZ VARY
GOTO IVZ
RETURN
VDESP MOVLW 0X01
MOVWF VARX
IVYY MOVLW 0XFF
MOVWF VARY
IVZZ MOVLW 0XFF
MOVWF VARZ
DVZZ DECFSZ VARZ
GOTO DVZZ
DECFSZ VARY
GOTO IVZZ
DECFSZ VARX
GOTO IVYY
RETURN
CIBERTEC CARRERAS PROFESIONALES
118
Resumen
El PIC16F877, al igual que el PIC16F84 también soporta 35 instrucciones y están
organizadas en tres grupos: las orientadas al byte, orientadas al bit y las orientadas
a las constantes/control.
Las instrucciones orientadas al bytes permiten transferir datos de 8 bits entre las
memorias y los registros. Las instrucciones orientadas al bit permiten manipular
selectivamente el estado de un bit de las celdas de memoria o registros y también
permiten averiguar en que estado se encuentra un bit. Las instrucciones literales
permiten transferir cualquier constante de 8 bits sobre el registro W.
El acceso a los puertos (PORTA, PORTB, PORTC, PORTD y PORTE) inicia con su
configuración a través de los registros TRISX. Un cero sobre los bits de estos
registros configura como salida a los bits relacionados en los PORTS y un uno
sobre estos configura como salida sus bits asociados en los PORTS.
Los puertos se encuentran ubicados en el banco 0 de RAM, mientras que, los
registros de configuración TRISX, se encuentran ubicados en el banco 1. El Banco
0 se selecciona fijando a 0 los bits RP0 y RP1 del registro STATUS, mientras que,
el banco 1 se habilita colocando un 1 sobre el bit RP0 y un 0 sobre el bit RP1.
El acceso a la memoria RAM se puede realizar de dos modos: directo e indirecto.
El directo se realiza seleccionando los bancos a través de los bits RP0 y RP1 e
indicando la dirección de la celda o el nombre de la celda asociada. El indirecto se
hace seleccionando los bancos a través del bit IRP del registro STATUS y el bit 7
del registro FSR, e indicando la dirección a través del registro FSR; El registro
INDF en este modo se encarga de la lectura y escritura de las celdas de memoria.
Si desea saber más acerca de estos temas, puede consultar las siguientes
páginas.
8[Link]
%20el%20manejo%20de%20puertos%20digitales
Aquí hallará información sobre la configuración y manipulación de los puertos.
CARRERAS PROFESIONALES CIBERTEC
MICROCONTROLADORES
119
UNIDAD DE
APRENDIZAJE
5
SEMANA
12
PROGRAMACIÓN DEL PIC16F877
LOGRO DE LA UNIDAD DE APRENDIZAJE
Al terminar la unidad, los alumnos podrán implementar circuitos aplicativos
basados en el PIC16F877. La polarización, reset, oscilación y los dispositivos de
salida se adaptarán al microcontrolador sin ningún tipo de.
Al terminar la unidad, los alumnos podrán desarrollar programas que pongan en
marcha el funcionamiento de circuitos aplicativos basados en el PIC16F877. Los
programas se realizarán en el computador, se transferirán al microcontrolador y
dejarán operativos al 100% la configuración y por lo menos al 80% la función
propuesta para la aplicación.
TEMARIO
Temporización
Desarrollo de programas
ACTIVIDADES PROPUESTAS
Los alumnos conectan los dispositivos al PIC.
Los alumnos configuran el sentido de trabajo de los puertos.
Los alumnos leen y escriben información sobre los puertos.
Los alumnos configuran y ponen en marcha los timers.
CIBERTEC CARRERAS PROFESIONALES
120
1. TEMPORIZACION
El PIC16F877 dispone de tres temporizadores denominados TMR0, TMR1 y TMR2.
Dos son de 8 bits y uno de 16 bits. A continuación se detallará su funcionamiento,
configuración y puesta en marcha de cada uno de estos:
1.1 El TMR0
El TMR0 de este PIC es de 8 bits y funciona del mismo modo que el TMR0 del
PIC16F84, puede trabajar en modo contador o temporizador. En el siguiente esquema
se observa el sistema funcional y los bits de configuración:
1.1.1 Modos de operación
Cuando funciona en el modo contador, el registro de trabajo TMR0, recibe los pulsos
provenientes de la entrada RA4, mientras que en el modo temporizador, los pulsos
provienen de la entrada F/4. Sin importar el modo en que opere, el principio de trabajo
es el mismo: ingresan los pulsos ya sea de RA4 o F/4, pasan por la preescala si se
requiere y llegan al registro de trabajo TMR0, el cual, por cada pulso recibido aumenta
hasta desbordarse, causando la activación del bit T0IF.
[Link] Modo Contador
Cuando trabajamos con este modo, es porque necesitamos contabilizar pulsos
externos, provenientes, lo más probable, de sensores. Es obligado seleccionar el clock
externo (RA4), fijar el tipo de flanco para el avance de la cuenta, anular el factor de
división (a menos que sea útil), y finalmente inicializar el registro de trabajo.
La aparición de cada flanco del sensor, se inyecta sobre la entrada de reloj del registro
de trabajo (TMR0), lo cual, aumenta en uno su valor. Recordemos que este registro es
de 8 bits, su valor mínimo es 00h y su valor máximo es FFh, es decir 0 y 255. Cuando
el registro se encuentra en su valor máximo (FFh o 255) y en ese instante recibe un
flanco más, este no puede pasar a 256, en cambio, regresa a su valor mínimo y activa
el bit de desborde T0IF (esto indica que la cuenta a culminado).
[Link].1 Secuencia de configuración
Supóngase que deseamos contabilizar 20 pulsos provenientes de un sensor óptico. El
sensor tendrá que ser conectado al pin RA4/T0CKI y la configuración será como se
muestra a continuación:
1- Elección del clock externo BSF OPTION_REG, T0CS
2- Fijar flanco de subida para la cuenta BCF OPTION_REG, T0SE
3- Anular el factor de división BSF OPTION_REG, PSA
4- Inicializar el registro de trabajo MOVLW .236
MOVWF TMR0
CARRERAS PROFESIONALES CIBERTEC
MICROCONTROLADORES
121
Recuerde el registro OPTION
RBPU INTDEG T0CS T0SE PSA PS2 PS1 PS0
bit 7 bit6 bit5 bit4 bit3 bit2 Bit1 bit0
T0CS: Selector de la fuente de reloj para el TMR0
1: Externa proveniente del pin RA4/TOCKI
0: Interna proveniente del cristal F/4
T0SE: Selector del tipo de flanco externo para el TMR0
1: Incremento del TIMER por flanco de bajada del pin RA4/TOCKI
0: Incremento del TIMER por flanco de subida del pin RA4/TOCKI
PSA: Desviador del factor de división de la señal de reloj
1: Hacia la función de WATCHDOG
0: Hacia la función del TIMER
Recordemos que el indicador T0IF se activa cuando el registro de trabajo pasa de su
valor máximo FFh (255) a su valor mínimo 00h (0). Y como nuestro registro de trabajo
aumentará en uno por cada flanco de subida del sensor, la activación del indicador
T0IF ocurrirá después de 256 (desborde de 255 a 0) – 236 (valor de inicialización del
registro de trabajo) pulsos; los 20 pulsos que deseamos contabilizar. Como fórmula, el
valor de inicialización (VI) del registro de trabajo TMR0 se obtiene al restar 256 menos
la cantidad de pulsos a registrar. VI = 256 – #PULSOS.
[Link] Modo Temporizador
Cuando trabajamos en este modo, es porque deseamos generar retardos o bases de
tiempo, como por ejemplo el segundero de un reloj. Es obligado seleccionar el clock
interno el cual obtiene la frecuencia del cristal dividida entre cuatro (F/4), de ser
necesario, elegir un factor de división y asignárselo al TMR0. La aparición de cada
pulso sobre la entrada de reloj del registro de trabajo (TMR0), hará que este aumente
en uno su valor, hasta que en algún momento genere su desbordamiento y por lo
tanto, la activación del indicador T0IF. Cada pulso que llegue al registro de trabajo
tiene una frecuencia que se calcula de la siguiente manera:
F = (f/4)/factor de división = f/(4*factor de división)
Si a esta le añadimos la cantidad de pulsos a contar, tendríamos:
F = f/(4*factor de división*#pulsos)
Pero, el tiempo transcurrido se calcularía:
T = (4*factor de división*#pulsos)/f
Frecuencia F = f/(4*factor de división*#pulsos)
Tiempo T = (4*factor de división*#pulsos)/f
Si tendríamos un cristal 4Mhz y querríamos generar un retardo de 10ms. ¿Cuál sería
el factor de división y cuantos pulsos serían necesarios contabilizar para lograr dicho
temporizado?.
Veamos: 10ms = 4*factord*#pulsos/4Mhz
10ms = factord*#pulsos * 1us ; ya que 1/Mhz es 1 microsegundo (us)
CIBERTEC CARRERAS PROFESIONALES
122
10ms = factord*#pulsos* 1ms/1000 ; ya que 1us = 1ms/1000
10ms*1000 = factord*#pulsos*1ms
1000 = factord*#pulsos
Observe el registro OPTION para saber que valores asignar al factor de división.
Registro OPTION
RBPU INTDEG T0CS T0SE PSA PS2 PS1 PS0
bit 7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
PS2-PS1-PS0: Selectores del factor de división de la señal de reloj
PS2 PS1 PS0 TIMER0 WATCHDOG
0 0 0 2 1
0 0 1 4 2
0 1 0 8 4
0 1 1 16 8
1 0 0 32 16
1 0 1 64 32
1 1 0 128 64
1 1 1 256 128
Haciendo el factord = 8 tendríamos: 1000 = 8*#pulsos
De aquí, #pulsos = 1000/8 = 125
Por lo tanto, el registro TMR0 tendría que ser inicializado con el valor: 256 – 125 = 131
[Link].2 Secuencia de configuración
Supóngase que deseamos lograr un temporizado de 40ms:
1- Elección del clock interno f/4 BCF OPTION_REG, T0CS
2- Asignar el factor de división al timer BSF OPTION_REG, PSA
3- Establecer el factor 32 de división BCF OPTION_REG, PS0
BCF OPTION_REG, PS1
BSF OPTION_REG, PS2
4- Inicializar el registro de trabajo MOVLW .131
(256 – 125) MOVWF TMR0
1.2 El TMR1
Este TIMER es de 16 bits y al igual que el TMR0, trabaja en los modos de cuenta y
temporización. A continuación sus características:
- Dispone de dos registros de trabajo de 8 bits denominados TMR1H y TMR1L
- Se puede elegir un clock externo o interno
- El clock externo podría provenir de un oscilador o una señal cualesquiera
- Se puede establecer un factor de división
- Interrumpe cuando los registros de trabajo se desbordan de FFFFh a 0000h
El siguiente esquema muestra el sistema funcional y sus bits de configuración:
CARRERAS PROFESIONALES CIBERTEC
MICROCONTROLADORES
123
1.2.1 Operación
La secuencia de trabajo del timer 1 es similar a la del timer 0, con la diferencia que
posee 16 bits de trabajo y no 8, tiene la posibilidad de adaptarle un oscilador externo,
lo cual, facilitaría el desarrollo de retardos mas amplios.
Recordemos el registro T1CON
El registro de control del timer 1, contiene los bits de habilitación, configuración y factor de división para el
timer 1.
T1CKPS1- T1CKPS0: Selector del factor de división
0 0 1
0 1 2
1 0 4
1 1 8
T1OSCEN: Oscilador externo
1: Habilitado
0: Deshabilitado
T1SYNC: Sincronización de entrada del oscilador externo
0: Habilitada
1: Desactivada
TMR1CS: Elección de la fuente de reloj
1: Externa a través del pin RC0/T1OSO/T1CKI
0: Interna (F/4)
TMR1ON: Puesta en marcha del timer
1: Activada
0: Desactivada
[Link] Secuencia de configuración en el modo contador
Supóngase que deseamos contabilizar 1000 pulsos provenientes de un sensor óptico.
El sensor tendrá que ser conectado al pin RC0/T1OSO/T1CKI y la configuración será
como se muestra a continuación:
1- Elegir clock externo BSF T1CON, TMR1CS
CIBERTEC CARRERAS PROFESIONALES
124
2- Desactivar el oscilador externo BCF T1CON, T1OSCEN
3- Anular el factor de división BCF T1CON, T1CKPS0
BCF T1CON, T1CKPS1
4- Inicializar los registros de trabajo MOVLW 0x18
MOVWF TMR1L
65536 – 1000 = 64536 = FC18 MOVLW 0XFC
MOVWF TMR1H
5- Poner en marcha al timer BSF T1CON, TMR1ON
Desde la puesta en marcha, los registros de trabajo del TMR1 aumentarán en uno por
cada pulso proveniente del pin RC0//T1OSO/T1CKI. Cuando pasen de su valor
máximo FFFFh (65535) a su valor mínimo 0000h (0) el bit T1IF se activara, indicando
que la cuenta a culminado.
El valor de inicialización para los registros TIMR1L y TIMR1H se obtiene restando
65536 (desborde del timer) y los 1000 pulsos que deseamos contabilizar. Al restar
estos valores se obtiene 64536, pero, debemos convertirlo a hexadecimal para realizar
la inicialización. El valor convertido es FC18h, donde, la parte alta (FCh) le
corresponde al registro TIMER1H, mientras que, la parte baja (18h) le corresponde al
registro TIMER1L.
[Link] Secuencia de configuración en el modo temporizador
Supóngase que se dispone de un cristal de 8Mhz y se desea realizar un retardo de
100ms. La configuración debería considerar los siguientes pasos:
1- Elección del clock interno f/4 BCF T1CON, TMR1CS
2- Elegir el factor 8 de división BSF T1CON, T1CKPS0
BSF T1CON, T1CKPS1
3- Inicializar los registros de trabajo MOVLW 0x58
MOVWF TMR1L
65536 – 25000 = 40536 = 9E58 MOVLW 0X9E
MOVWF TMR1H
4- Poner en marcha al timer BSF T1CON, TMR1ON
Recordemos que el tiempo transcurrido para la temporización se calcula de la
siguiente manera:
T= (4*factor de división*pulsos a contar)/f
Veamos: T = ( 4 * 8 * 25000 ) / 8Mhz
T = ( 4 * 25000 ) / 1Mhz
T = 100000 / 1Mhz
CARRERAS PROFESIONALES CIBERTEC
MICROCONTROLADORES
125
Pero, 1Mhz = 1000Khz
Entonces : T = 100000 / 1000Khz
T = 100 / 1Khz
T = 100 * 1/1Khz
Pero, 1/1Khz = 1ms
Por lo tanto: T = 100 ms (el tiempo requerido).
1.3 El TIMR2
Este timer es de 8 bits al igual que el TMR0, pero, sólo funciona en modo temporizador
y tiene un modo especial de operar. A continuación sus características:
- Dispone de dos registros de trabajo de 8 bits denominados TMR2 y PR2
- Solo trabaja con el clock interno (f/4)
- Se puede establecer un pre y post factor de división
- Interrumpe cuando el post factor de división reinicia
1.3.1 Operación
El registro de trabajo TMR2 incrementa
su valor por cada pulso recibido, es
decir, por cada f/4/pre factor de división.
En algún momento, el valor de este
registro coincide con el valor del
registro PR2, por lo cual, suceden dos
cosas: la primera es reiniciar a 0 el
valor del registro TMR2, y la segunda
es afectar al post divisor,
disminuyéndolo en uno cada vez que
esto sucede. Cuando el valor del post divisor (postscaler) se hace cero, suceden dos
cosas más: la primera es reiniciar el valor de post división de acuerdo a la
configuración realizada y la segunda es activar el bit indicador de interrupción TMR2IF,
culminando de este modo el proceso.
El modo operativo es parecido al timer0, la diferencia radica en la reinicialización
automática del registro de trabajo TMR2, lo cual, facilita el trabajo de las bases de
tiempo.
Recordemos el registro T2CON
- TOUTPS3 TOUTPS2 TOUTPS1 TOUTPS0 TMR2ON T2CKPS1 T2CKPS0
Bit7 Bit6 bit5 bit4 bit3 bit2 Bit1 Bit0
TOUTPSX: Selector del factor de post división
TOPS3 S2 S1 S0 POST TMR2
0 0 0 0 1
0 0 0 1 2
0 0 1 0 3
0 0 1 1 4
. .
. .
. .
CIBERTEC CARRERAS PROFESIONALES
126
1 1 1 1 16
TMR2ON: Puesta en marcha del timer
1: Activada
0: Desactivada
T2CKPSX: Selector del factor de división
T2CKPS1 PS0 TMR2
0 0 1
0 1 4
1 0 16
1 1 16
[Link] Secuencia de operación
Realice la secuencia necesaria para establecer una base de tiempo de 32 ms, es
decir, generar interrupciones repetitivas del TMR2 cada 32 ms. Considere además que
el cristal es de 4Mhz.
Los siguientes pasos deben tenerse en cuenta para la configuración:
1- Inicializar TMR2 en cero CLRF TMR2
2- Fijar el valor del registro PR2 en 250 MOVLW .250
MOVWF PR2
3- Seleccionar el factor de pre división BSF T2CON, T2CKPS0
en 16 BSF T2CON, T2CKPS1
4- Establecer el factor de post division BSF T2CON, T2OUTPS0
BSF T2CON, T2OUTPS1
En 8 BSF T2CON, T2OUTPS2
BCF T2CON, T2OUTPS3
5- Poner en marcha al timer BSF T2CON, TMR2ON
E tiempo total transcurrido seria: 4*16*250*8/4Mhz = 32000us = 32ms
CARRERAS PROFESIONALES CIBERTEC
MICROCONTROLADORES
127
1.4 Desarrollo de programas
A continuación se propondrán programas que tienen como aplicación el uso de los
temporizadores.
1.4.1 Pimpón de un led encendido
Realice el programa que muestre de modo repetitivo, sobre el puerto D, la secuencia
de desplazamiento de un solo led encendido de derecha a izquierda y viceversa. Cada
led debe permanecer encendido durante ½ segundo. Utilice el TMR1 para la
temporización.
Realicemos los cálculos previos para el factor de división y el valor inicial del registro
de trabajo.
Recordemos que el tiempo se calcula:
T= (4*factor de división*pulsos a contar)/f
Veamos:
Considerando el factor máximo de división (8) y la frecuencia del cristal de 4Mhz
(según el esquema), los pulsos a contabilizar serían:
Pulsos a contar = T*f/4*factor de división = 500ms*4000Khz/4*8 = 62,500
Pero, el valor inicial de los registros de trabajo se obtiene como 65,536 – 62,500
Y 3036 a hexadecimal es 0BDC. Por lo tanto:
TMR1H = 0Bh y TMR1L = DCh
El registro T1CON de configuración del TMR1 está ubicado en el banco 0 de memoria,
al igual que, los registros de trabajo TMR1H y TMR1L, y el registro PIR1 que contiene
el bit TMR1IF (indicador de la culminación del temporizado)
CIBERTEC CARRERAS PROFESIONALES
128
Iniciemos el programa.
ORG 0X0000 ; vector de reset
INICIO BSF STATUS,RP0 ;Selección del banco 1 para
BCF STATUS,RP1 ;configurar el puerto D
CLRF TRISD ;PORTD OUT
BCF STATUS,RP0 ;selección del banco 0 para manipular los
;puertos y configurar la temporización
CLRF PORTD ;leds apagados
BCF T1CON, TMR1CS ;elección del clock interno f/4
BSF T1CON, T1CKPS0 ;elegir el factor 8
BSF T1CON, T1CKPS1 ;de división
MOVLW 0XDC ;inicializar los registros de trabajo
MOVWF TMR1L ;TMR1L = DC
MOVLW 0X0B ;
MOVWF TMR1H ;TMR1H = 0B
BSF T1CON, TMR1ON ; Poner en marcha el TMR1
PIMPON MOVLW B’10000000’ ;encendido del led
MOVWF PORTD ;de la izquierda
MEDIOSEGD BTFSS PIR1,TRM1IF ;salta a desplazad si el indicador se activa
GOTO MEDIOSEGD ;sigue sensando el indicador de desborde
DESPLAZAD BCF PIR1,TMR1IF ;limpia el indicador de desborde del TMR1
MOVLW 0XDC ;reiniciar los registros de trabajo
MOVWF TMR1L ;TMR1L = DC
MOVLW 0X0B ;
MOVWF TMR1H ;TMR1H = 0B
BCF STATUS,C ;limpia indicador de carry
RRF PORTD ;rota a la derecha el encendido del led
BTFSS STATUS,C ;salta si se completa el desplazamiento
GOTO MEDIOSEGD ;sigue desplazando a la derecha
MOVLW 0X’00000001’ ;encendido del led
MOVWF PORTD ;de la derecha
MEDIOSEGI BTFSS PIR1,TRM1IF ;salta a desplazai si el indicador se activa
GOTO MEDIOSEGI ;sigue sensando el indicador de desborde
DESPLAZAI BCF PIR1,TMR1IF ;limpia el indicador de desborde del TMR1
MOVLW 0XDC ;reiniciar los registros de trabajo
MOVWF TMR1L ;TMR1L = DC
MOVLW 0X0B ;
MOVWF TMR1H ;TMR1H = 0B
CARRERAS PROFESIONALES CIBERTEC
MICROCONTROLADORES
129
BCF STATUS,C ;limpia el indicador de carry
RLF PORTD ;rota a la izquierda el encendido del led
BTFSS STATUS,C ;salta si se completa el desplazamiento
GOTO MEDIOSEGI ;sigue desplazando
GOTO PIMPON ;repite efecto pimpón
1.4.2 Onda cuadrada
Realice el programa que muestre sobre la patilla 2 del puerto B, una onda cuadrada
que tenga una frecuencia de 1Khz. Utilice el TMR2 para la temporización de 1/2
milisegundo.
Realicemos los cálculos previos para el factor de división y el valor inicial del registro
de trabajo.
Recordemos que el tiempo se calcula:
T= (4*factor de división*PR2)/f
Veamos:
Considerando como factor de división 4, la frecuencia del cristal de 4Mhz (según el
esquema) y 25 el valor de PR2. El tiempo transcurrido en cada coincidencia con PR2
sería: 4*4*25/4Mhz = 0.1ms y considerando el factor de post división 5, el tiempo total
transcurrido serían: 0.1 * 5 = 0.5ms.
Los registros TMR2, T2CON y PIR1 pertenecen al banco 0 de memoria ram, mientras
que, el registro PR2 está ubicado en el banco 1.
CIBERTEC CARRERAS PROFESIONALES
130
Iniciemos el programa:
ORG 0X0000 ; vector de reset
INICIO BSF STATUS,RP0 ;Selección del banco 1 para
BCF STATUS,RP1 ;configurar el puerto D
BCF TRISB,2 ;PORTB,2 OUT
MOVLW .25 ;W =25
MOVWF PR2 ;PR2 = W = 25
BCF STATUS,RP0 ;selección del banco 0 para manipular los
;puertos y configurar la temporización
BCF PORTB,2 ;onda = low
BCF T2CON,T2CKPS0 ;factor de
BSF T2CON,T2CKPS1 ;división 4
BCF T2CON,TOUTPS0 ;factor
BCF T2CON,TOUTPS1 ;de post
BSF T2CON,TOUTPS2 ;division
BCF T2CON,TOUTPS3 ;5
MOVLW .0 ;valor inicial
MOVWF TMR2 ;de partida del TMR2
BSF T2CON,TMR2ON ;activa el funcionamiento del TMR2
ONDA BCF PORTB,2 ;onda=low
BAJO BTFSS PIR1, TMR2IF ;salta si indicador de TMR2 se activa
GOTO BAJO ;sigue onda en nivel bajo
BCF T2CON,TMR2IF ;limpia indicador
BSF PORTB,2 ;onda = high
ALTO BTFSS PIR1, TMR2IF ;salta si indicador de TMR2 se activa
GOTO ALTO ;sigue onda en nivel alto
BCF T2CON,TMR2IF ;limpia indicador
GOTO ONDA ;repite la onda
CARRERAS PROFESIONALES CIBERTEC
MICROCONTROLADORES
131
Resumen
El PIC16F877 dispone de tres temporizadores para el tratamiento de las
aplicaciones relacionadas con el tiempo, los dispositivos se denominan TMR0,
TMR1 y TMR2.
El temporizador TMR0 es de 8 bits y trabaja de modo idéntico al temporizador
TMR0 del PIC16F84.
El temporizador TMR1 es de 16 bits. Sus registros de trabajo son TMR1H y
TMR1L, estos registros pueden operar recibiendo los pulsos provenientes del
cristal F/4 (reloj interno) o de una fuente externa de reloj (proveniente de algún
sensor u oscilador), poseen una preescala de división, máxima de 8, que aletarga
la llegada de los pulsos a sus registros de trabajo. Generado el desborde de los
registros se activa su bit indicador TMR1IF.
El temporizador TMR2 es de 8 bits y algo especial en su funcionamiento. Sólo
trabaja con el reloj interno (F/4), dispone de una preescala de división y de una
post escala de división. Y utiliza dos registros: el TMR2 y el PR2. La preescala
aletarga los pulsos que llegan al registro TMR2 y hace que este aumente su valor.
Cada vez que el valor de este registro coincide con el registro PR2, el valor de la
post escala de división disminuye en uno y el registro TMR2 se reinicia en 0. Si el
valor de la post escala de división se desborda, culmina el temporizado
activándose el bit indicador TMR2IF y recargándose la post escala de división con
su valor de previa configuración.
Si desea saber más acerca de estos temas, puede consultar las siguientes
páginas.
8 [Link]
Aquí hallará información sobre los temporizadores
CIBERTEC CARRERAS PROFESIONALES
132
UNIDAD DE
APRENDIZAJE
5
SEMANA
13
PROGRAMACIÓN DEL PIC16F877
LOGRO DE LA UNIDAD DE APRENDIZAJE
Al terminar la unidad, los alumnos podrán implementar circuitos aplicativos
basados en el PIC16F877. La polarización, reset, oscilación y los dispositivos de
salida se adaptarán al microcontrolador sin ningún tipo de.
Al terminar la unidad, los alumnos podrán desarrollar programas que pongan en
marcha el funcionamiento de circuitos aplicativos basados en el PIC16F877. Los
programas se realizarán en el computador, se transferirán al microcontrolador y
dejarán operativos al 100% la configuración y por lo menos al 80% la función
propuesta para la aplicación.
TEMARIO
Comunicación serie
Conversión análoga digital
Desarrollo de programas
ACTIVIDADES PROPUESTAS
Los alumnos conectan los dispositivos al PIC.
Los alumnos configuran el sentido de trabajo de los puertos serie.
Los alumnos leen y escriben información sobre los puertos serie.
CARRERAS PROFESIONALES CIBERTEC
MICROCONTROLADORES
133
1 COMUNICACIÓN SERIE
La comunicación serie es un medio muy necesario si se trata de ahorrar líneas de
conexión o alcanzar mayores distancias que la comunicación paralela limita. En la
actualidad esta forma de transferir información es frecuentemente usada por los
circuitos integrados y sistemas digitales. El Microcontrolador PIC16F877 dispone de
varios modos de comunicación de este tipo, aquí describiremos y analizaremos uno de
estos.
1.1 USART
El USART (universal sincrono asíncrono recepción transmisión), permite transmitir y
recibir información bit a bit cual fuese el desplazamiento de un registro. Cada dato de 8
bits es transferido bajo un formato de comunicación:
1 bit de start (0)
8 bits de datos (XXXXXXXX)
1 bit de control (paridad)
1 bit de stop (1)
El USART puede funcionar de modo síncrono o asíncrono. Cuando trabaja en modo
síncrono utiliza una señal de reloj para el sincronismo y sólo puede operar en una
dirección, es decir, sólo transmite o sólo recibe información. Mientras que cuando
trabaja en modo asíncrono, puede transferir o recibir información.
La comunicación serie maneja un parámetro que determina la velocidad de
desplazamiento de los bits. Esta se mide en baudios (bits por segundo). Es necesario
que el sistema transmisor y receptor sincronisen este parámetro.
1.1.1 Transmisión de un dato
En este proceso, los datos que se desean transmitir se escriben sobre un registro
especial y automáticamente empieza la transmisión, enviándose uno por uno los bits
a través del pin RC6 del Microcontrolador, hasta vaciar totalmente el contenido del
registro. Observando el esquema de abajo, notamos que la escritura se debe realizar
sobre el registro TXREG. Este a su vez, transfiere su valor sobre el registro TSR. Y
desde este registro se inicia el desplazamiento de los bits, de izquierda a derecha y
tan rápido como lo permita el generador de baudios. Cada bit desplazado pasa por el
buffer para llegar finalmente a transmitirse por el pin RC6/TX/CK.
CIBERTEC CARRERAS PROFESIONALES
134
Observe que, para la transferencia de los bits hacia el pin RC6/TX/CK, existe un bit de
control llamado SPEN (habilitador del puerto serie). Este debe encontrarse habilitado,
de lo contrario ningún bit podrá salir del buffer. El proceso en detalle sería:
a) Copia manual del dato (a transmitir) sobre el registro TXREG.
b) Copia automática de TXREG sobre el registro TSR.
c) Activación del indicador TXIF y si la interrupción por transmisión estuviese
activada (TXIE = 1), se generaría la interrupción respectiva. Al mismo tiempo el
indicador de proceso de la transmisión se activa (TRMT = 0).
d) Transmisión del bit de START (LSB) de TSR hacia el pin RC6/TX/CK.
e) Transmisión bit a bit de los 8 siguientes bits (dato) de TSR. Y si la transmisión
del noveno bit se encontrase habilitado (TX9=1), inmediatamente se
transmitiría el bit TX9D, que podría ser el bit de paridad del dato enviado.
f) Desactivación del indicador de proceso de la transmisión (TRMT = 1).
g) Y finalmente, se transmite el bit de STOP (1).
La rapidez con la que se desplazan los bits es controlada por el registro SPBRG y el
bit BRGH. Pero a su vez para que esta señal de sincronismo se pueda utilizar debe
activarse (1) el bit TXEN.
1.1.2 Recepción de datos
En este proceso, los datos son recibidos bit a bit a través del pin RC7, los cuales
ingresan a un registro especial para formar el dato de 8 bits. El proceso se inicia con la
aparición del bit de START (0) sobre el pin RC7/RX/DT. Note en el siguiente esquema
que para recibir los datos provenientes de este pin, el puerto serial debe encontrarse
habilitado (SPEN = 1).
El proceso continua según el siguiente orden:
a) El bit en cero (bit de START) es recuperado y desplazado hacia RSR.
b) Recuperación de los 8 bits siguientes (DATO) y desplazamiento hacia RSR.
c) Recuperación del noveno bit (si lo hubiese) y desplazamiento hacia RSR.
d) Recuperación del bit de STOP (1), el cual es desplazado hacia el registro RSR
del mismo modo y genera tres acciones:
1- Los ocho bits de datos de este registro <7:0> son transferidos a RCREG.
2- El bit (8) es trasladado al bit RX9D, si está habilitado (RX9 = 1).
3- Activación del indicador RCIF y la interrupción respectiva si está habilitada.
CARRERAS PROFESIONALES CIBERTEC
MICROCONTROLADORES
135
La rapidez con la que se desplazan los bits es controlada por el registro SPBRG y el
bit BRGH. Los bits OERR y FERR son indicadores de error durante la recepción.
1.1.3 Registros asociados
Es necesario configurar y manipular los bits de estos registros para tener acceso a
este tipo de comunicación. Los registros asociados son:
TXSTA: Registro de configuración para la transmisión. Está ubicado en el banco 1
RCSTA: Registro de configuración para la recepción. Pertenece al banco 0
SPBRG: Registro para la configuración de los baudios. Se encuentra en el banco 1
RCREG: Registro de datos de la recepción. Se trabaja en el banco 0
TXREG: Registro de datos de la transmisión. Se sitúa en el banco 0.
[Link] Registro TXSTA
Este registro muestra el estado y permite el control de la transmisión de datos seriales.
CSRC TX9 TXEN SYNC - BRGH TRMT TX9D
Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0
CSRC: Selector de la fuente de clock en modo sincrono
0: clock externo
1: clock interno
TX9: Habilitador de transmisión del noveno bit
0: desactivado
1: activado
TXEN: Habilitador de la señal de reloj (baudios)
0: desactivado
1: activado
CIBERTEC CARRERAS PROFESIONALES
136
SYNC: Selector del modo de trabajo
0: Asíncrono
1: Sincrono
BRGH: Selector de velocidad en modo asíncrono
0: baja
1: alta
TRMT: Indicador del estado del registro de desplazamiento de transmisión
0: En proceso de transmisión
1: vació
TX9D: Noveno bit de dato a transmitir
[Link] Registro RCSTA
Este registro muestra el estado y permite el control de la recepción de datos seriales.
SPEN RX9 SREN CREN ADDEN FERR OERR RX9D
Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0
SPEN: Habilitador del puerto serial
0: desactivado
1: activado
RX9: Habilitador del noveno bit a recibir
0: desactivado
1: activado
SREN: Habilitador de recepción simple en el modo sincrono maestro
0: deshabilitado
1: habilitado
CREN: Habilitador de recepción continua en modo sincrono asíncrono
0: desactivado
1: activado
ADDEN: Habilitador del detector de dirección
0: desactivado
1: activado
FERR: Indicador de error de trama
0: off
1: on
OERR: Indicador de error de sobrecorrimiento
0: off
1: on
RX9D: Noveno bit a recibir
CARRERAS PROFESIONALES CIBERTEC
MICROCONTROLADORES
137
[Link] Registro SPBRG
Como se menciono en algunas líneas antes, la velocidad depende del valor del
registro SPBRG y del bit BRGH del registro TXSTA, tal como se muestra en la
siguiente tabla:
SYNC Baja velocidad (bit BRG = 0) Alta velocidad (bit BRG = 1)
0 (asíncrono) Baudios = F/64(X+1) Baudios = F/16(X+1)
1 (síncrono) Baudios = F/4(X+1) n/a
El valor de X puede variar de 0 a 255. Supóngase que se desea establecer la
velocidad a 2400 baudios (bits por segundo) en el modo asíncrono y en alta velocidad.
La formula a utilizar seria Baudios = F/16(X+1). Considere que el cristal es de 4Mhz.
Reemplazando valores tenemos:
2400Hz = 4Mhz/(16(X+1))
2400Hz = 4000000Hz/(16(X+1))
X+1 = 4000000HZ/16*2400Hz
X+1 = 104.16
X = 103.16
Pero, como X es un valor entero, lo redondeamos a 103.
Con estos resultados las instrucciones que lograrían establecer esta velocidad serian:
BSF TXSTA, BRGH
MOVLW .103
MOVWF SPBRG
1.1.4 Secuencia de configuración para la transmisión
Supóngase que se desea transmitir un valor por el puerto serial a una velocidad de
4800 baudios, sin 9no bit (paridad), en modo asíncrono y utilizando un cristal de 8Mhz.
Los pasos a considerar son:
1- Establecer la velocidad de comunicación a 4800 baudios.
2- Seleccionar el modo de comunicación asíncrono.
3- Deshabilitar el 9no bit de dato (paridad).
4- Habilitar la transmisión.
5- Habilitar el puerto serial.
6- Transmitir el dato deseado.
Las instrucciones serian:
BCF TXSTA,BRGH ;velocidad
MOVLW .25 ;a
MOVWF SPBRG ;4800 baudios
BCF TXSTA,SYN ;selección del modo asincrónico
BCF TXSTA,TX9 ;desactivación del 9no bit de datos (paridad)
BSF TXSTA,TXEN ;habilitación de la transmisión
BSF RCSTA,SPEN ;habilitación del puerto serial
Con la ejecución de estas instrucciones el puerto serial quedaría configurado y listo
para transmitir cualquier dato. Supongamos que se desea enviar una constante, por
ejemplo 55h, las instrucciones serian:
CIBERTEC CARRERAS PROFESIONALES
138
MOVLW 0X55 ;
MOVWF TXREG ;inicia la transmisión del valor 55h
Si en lugar de una constante, se desea enviar el valor de una variable, cuyo nombre es
DATO, las instrucciones serian:
MOVFW DATO ;
MOVWF TXREG ;inicia la transmisión de la variable DATO
Pero, si se quisiera enviar el valor de un puerto, por ejemplo el valor del PORTD, las
instrucciones serian:
MOVFW PORTD ;
MOVWF TXREG ;inicia la transmisión del valor del PORTD
Y si se deseara enviar el valor de una celda de memoria ram, se haría a través del
registro INDF, así:
MOVFW INDF ;
MOVWF TXREG ;inicia la transmisión del valor del registro INDF
1.1.5 Secuencia de configuración para la recepción
Supóngase que se desea recibir valores por el puerto serial a una velocidad de 9600
baudios, sin 9no bit (paridad), en modo asíncrono y con un cristal de 8Mhz.
1- Establecer la velocidad de comunicación a 9600
2- Seleccionar el modo de comunicación asíncrono
3- Deshabilitar el 9no bit de dato (paridad)
4- Establecer el modo recepción
5- Deshabilitar la transmisión (habilitar la recepción)
6- Habilitar el puerto serial
7- Recibir datos
Las instrucciones serian:
BCF TXSTA,BRGH ;velocidad
MOVLW .12 ;a
MOVWF SPBRG ;9600 baudios
BCF TXSTA,SYN ;selección del modo asincrónico
BCF TXSTA,TX9 ;desactivación del 9no bit de datos (paridad)
BCF TXSTA,TXEN ;deshabilitación de la transmisión
BSF RCSTA,SPEN ;habilitación del puerto serial
Con la ejecución de estas instrucciones el puerto serial quedaría configurado y listo
para recibir cualquier dato. Tenemos dos opciones para recibir un dato:
1- Activar la interrupción por recepción y desarrollar la subrutina de interrupción
relacionada para esto.
2- No activar la interrupción, pero, verificar constantemente el estado del indicador
de interrupción RCIF, cuando este bit se pone a 1 es porque acaba de recibirse
un dato y se encuentra disponible en el registro RCREG.
CARRERAS PROFESIONALES CIBERTEC
MICROCONTROLADORES
139
Supongamos que no se activa la interrupción por recepción y deseamos mostrar por el
PORTB cada dato que llegue por el puerto serial, las instrucciones serian:
NEW BCF PIR1,RCIF ;limpia el indicador de recepción
WAIT BTFSS PIR1,RCIF ;salta si el indicador se activa
GOTO WAIT ;sigue sensando
MOVFW RCREG ;W = DATO SERIAL
MOVWF PORTB ;PORTB = W
GOTO NEW ;repite desde NEW
1.2 Conversión análoga digital
El PIC16F877 tiene 8 canales de entrada para la conversión análoga digital. Estas
ocho líneas se encuentran repartidas entre el PORTA (5 canales) y PORTE (3
canales). Cualquier señal analógica ingresada por alguna de estas patillas es
convertida a digital a través de aproximaciones sucesivas controladas por una señal
de reloj, y el resultado de la conversión se representa en un número binario de 10 bits
(ADRESH – ADRESL). Toda conversión analógica a digital requiere de un voltaje de
referencia, en este caso la señal de referencia es programable, la cual puede ser
configurada seleccionando la combinación VDD, VSS, RA2 o RA3, tal como se
muestra en el esquema siguiente:
CIBERTEC CARRERAS PROFESIONALES
140
1.2.1 Registros asociados
La conversión análoga digital tiene asociado cuatro registros:
- Dos de control: ADCON0 y ADCON1, que pertenecen a los bancos 0 y 1
respectivamente.
- Y dos de datos : ADRESH y ADRESL, que pertenecen a los bancos 0 y 1
respectivamente..
[Link] Registro ADCON0
Este registro de control se encarga de la configuración y control de la operación de la
conversión análoga digital. Veamos sus bits:
ADCS1 ADCS0 CHS2 CH1 CH0 GO/DONE - ADON
Bit7 bit6 bit5 bit4 bit3 bit2 Bit1 Bit0
ADCSX: Selección del reloj de conversión
ADCS1 S0 RELOJ
0 0 F/2
0 1 F/8
1 0 F/32
1 1 FRC
CHSX: Selección del canal de conversión
CHS2 S1 S0 CANAL
0 0 0 0 (RA0)
0 0 1 1 (RA1)
0 1 0 2 (RA2)
0 1 1 3 (RA3)
1 0 0 4 (RA5)
1 0 1 5 (RE0)
1 1 0 6 (RE1)
1 1 1 7 (RE2)
GO/DONE: Puesta en marcha de la conversión
1: En progreso
0: Culminó la conversión
ADON: Activación de la conversión.
1: Activada
0: Desactivada
[Link] El registro ADCON1
Este registro se encarga de establecer el formato del resultado de la conversión, fijar la
operación digital o analógica de los pines de los puertos A y E, y definir la señal de
referencia. Veamos sus bits:
ADFM - - - PCFG3 PCFG2 PCFG1 PCFG0
Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0
ADFM: Formato del resultado de conversión
0: Justificado a la izquierda (8 bits ADRESH y 2 bits ADRESL)
1: justificado a la derecha (2 bits ADRESH y 8 bits ADRESL)
CARRERAS PROFESIONALES CIBERTEC
MICROCONTROLADORES
141
PCFGX: Configuración de los pines para funcionar como analógicos o digitales
y establecer el voltaje de referencia.
PCFG3: AN7 AN6 AN5 AN4 AN3 AN2 AN1 AN0
VREF+ VREF-
PCFG0 RE2 RE1 RE0 RA5 RA3 RA2 RA1 RA0
0000 A A A A A A A A VDD GND
0001 A A A A - A A A RA3 GND
0010 D D D A A A A A VDD GND
0011 D D D A - A A A RA3 GND
0100 D D D D A D A A VDD GND
0101 D D D D - D A A RA3 GND
0110 D D D D D D D D - -
0111 D D D D D D D D - -
1000 A A A A - - A A RA3 RA2
1001 D D A A A A A A VDD GND
1010 D D A A - A A A RA3 GND
1011 D D A A - - A A RA3 RA2
1100 D D D A - - A A RA3 RA2
1101 D D D D - - A A RA3 RA2
1110 D D D D D D D A VDD GND
1111 D D D D - - D A RA3 RA2
1.2.2 Secuencia de configuración
Suponga que se tiene conectado en la patilla RA0 un sensor de luz y se necesita
obtener sus valores.
La secuencia de configuración debería tener los siguientes pasos:
1- Asegurar que la patilla RA0 quede configurada como entrada analógica
2- Establecer como voltajes de referencia VDD (+5v) y GND (0v)
3- Fijar el formato del resultado de la conversión a 2 bits ADRESH y 8 bits ADRESL
4- Seleccionar la señal de reloj a F/8
5- Seleccionar a la patilla RA0 como el canal de entrada para la conversión
6- Activar el sistema de conversión
7- poner en marcha la conversión
Las instrucciones serían:
BSF ADCON1,ADFM ;Formato del resultado 2 bits ADRESH y 8 bits ADRESL
BCF ADCON1,PCFG0 ;Configuración de la
BSF ADCON1,PCFG1 ;patilla RA0 como entrada
BSF ADCON1,PCFG2 ;analógica y voltaje de referencia
BSF ADCON1,PCFG3 ;VDD con GND
BSF ADCON0, ADCS0 ;selección de la señal de
BCF ADCON0, ADCS1 ;reloj a F/8
BCF ADCON0, CHS0;selección de la
BCF ADCON0, CHS1;patilla RA0 como
BCF ADCON0, CHS2;canal de conversión
BSF ADCON0, ADON ;activa la conversión
NOP ;tiempo
CIBERTEC CARRERAS PROFESIONALES
142
NOP ;de espera
NOP ;para iniciar
NOP ;cada conversión
BSF ADCON0,GO/DONE ;pone en marcha la conversión.
A partir de este instante se inicia el proceso de conversión, para saber si ya culminó
esta, tendríamos que inspeccionar el bit GO/DONE. Si este bit se encuentra en 1 es
porque aun continúa tal conversión, pero si está en 0 es porque la conversión ya
finalizo. Por lo tanto, podemos manipular el valor del resultado disponible en los
registros ADRESH y ADRESL para tomar las decisiones necesarias. Es necesario
esperar unos 4us antes de iniciar cada conversión.
1.3 Desarrollo de programas
A continuación se propondrán aplicaciones que utilicen el puerto serie y los canales de
conversión A/D.
1.3.1 Recepción de datos de una PC
Realice el programa que permita recibir por el puerto serial, valores enviados desde la
Pc. Estos valores recibidos deben reflejarse sobre los leds del puerto B. La Pc enviará
por el COM2 el valor SCII de cualquier tecla presionada a la velocidad de 2400
baudios.
Iniciemos el desarrollo del programa:
CARRERAS PROFESIONALES CIBERTEC
MICROCONTROLADORES
143
ORG 0x0000
INICIO BSF STATUS,RP0
BCF STATUS,RP1
BSF TRISC,7 ;PORTB,7 IN
MOVLW 0X00 ;PORTB
MOVWF TRISB ;OUT
BSF TXSTA, BRGH ;velocidad
MOVLW .207 ;a 2400
MOVWF SPBRG ;baudios
BCF TXSTA,SYN ;selección del modo asincrónico
BCF TXSTA,TX9 ;desactivación del 9no bit de datos (paridad)
BCF TXSTA,TXEN ;deshabilita la transmisión
BCF STATUS,RP0
BSF RCSTA,CREN ;habilita recepción continua
BSF RCSTA,SPEN ;habilitación del puerto serial
BCF PIR1,RCIF
LEE BTFSS PIR1,RCIF ;salta si el indicador de dato recibido se activo
GOTO LEE ;salta y sigue sensando el indicador
MOVFW RCREG ;W = RCREG = dato que se acaba de recibir
MOVWF PORTB ;PORTB = W : LEDS = dato recibido
BCF PIR1,RCIF ;desactiva el indicador
GOTO LEE ;salta para recibir un dato otra
CIBERTEC CARRERAS PROFESIONALES
144
1.3.2 Visualización de conversión analógica
Realice el programa que permita mostrar constantemente a través de los puertos B y
D el valor digital del voltaje ingresado a través de la patilla PA1 (RA1). El puerto B
mostrará los 8 bits menos significativos mientras que el puerto D mostrará los dos bits
más significativos.
Se utilizará la señal de reloj F/8 ya que está se configura hasta frecuencias máximas
de cristal de 5Mhz y según el esquema el cristal es de 4Mhz. El voltaje de referencia
será VDD y GND y el formato de conversión debe ser 2 bits ADRESH y 8 bits
ADRESL. Según este último parámetro de configuración, el puerto B mostraría la
información del registro ADRESL, mientras que el puerto D la información del registro
ADRESH.
Iniciemos el programa.
ORG 0X0000
INICIO BSF STATUS, RP0
BCF STATUS, RP1
CLRF TRISB ; PORTB OUT
CLRF TRISD ; PORTD OUT
BSF ADCON1, ADFM ; Formato 2 bits ADRESH y 8 bits ADRESL
BCF ADCON1, PCFG0 ; Configuración de la
BCF ADCON1, PCFG1 ; patilla RA1 como entrada
BSF ADCON1, PCFG2 ; analógica y voltaje de referencia
BCF ADCON1, PCFG3 ; VDD con GND
BSF TRISA,1 ; PORTA,1 IN
BCF STATUS, RP0
CARRERAS PROFESIONALES CIBERTEC
MICROCONTROLADORES
145
CLRF PORTB ; LEDS
CLRF PORTD ; APAGADOS
BSF ADCON0, ADCS0 ; selección de la señal de
BCF ADCON0, ADCS1 ; reloj a F/8
BSF ADCON0, CHS0 ; selección de la
BCF ADCON0, CHS1 ; patilla RA1 como
BCF ADCON0, CHS2 ; canal de conversión
BSF ADCON0, ADON ; activa la conversión
NOP ; tiempo
NOP ; de espera
NOP ; para iniciar
NOP ; cada conversión
NEW BSF ADCON0, GO/DONE ; pone en marcha la conversión.
WAIT BTFSC ADON0,GO/DONE ; salta si culmina la conversión
GOTO WAIT ; sigue sensando fin de conversión
MOVFW ADRESH ; Muestra en el PORTD
MOVWF PORTD ; los dos bits de la conversión
BSF STATUS,RP0 ;
MOVFW ADRESL ; Muestra en el PORTB
MOVWF PORTB ; los 8 bits restantes de la conversión
BCF STATUS, RP0
GOTO NEW ; salta a NEW por una nueva conversión
CIBERTEC CARRERAS PROFESIONALES
146
1.3.2 Iluminación automática
Realice el programa que permita prender o apagar un foco según la cantidad de luz
natural. El sensor de luz provee un rango de voltajes según la cantidad de luz que
incida sobre este, suponga que tras las pruebas, una luz óptima natural genera un
voltaje de 1v y una luz tenue, apenas visible genera un voltaje de 3.5v. Por lo tanto,
para los valores menores o iguales a 1v la luz del foco se debe apagar, mientras que
para los valores iguales o mayores a 3.5v la luz del foco se tendrá que encender.
Se utilizará la señal de reloj F/8 ya que está se configura hasta frecuencias máximas
de cristal de 5Mhz y según el esquema el cristal es de 4Mhz. El voltaje de referencia
será VDD y GND y el formato de conversión debe ser 8 bits ADRESH y 2 bits
ADRESL. Los valores convertidos en ADRESH servirán para tomar la decisión de
apagar o encender el foco. Para 1v de conversión los registros ADRESH y ADRESL
mostrarían el número 241, pero ADRESH valdría 00111100, es decir 60, mientras que
para un voltaje de conversión de 3.5v los registros mostrarían el valor 767, pero,
ADRESH valdría 10111111, es decir 191. Por lo tanto, cualquier valor menor a 60
prenderá el foco y cualquier valor mayor a 191 lo apagará.
Iniciemos el programa.
ORG 0X0000
INICIO BSF STATUS, RP0
BCF STATUS, RP1
BCF ADCON1, ADFM ; Formato 8 bits ADRESH y 2 bits ADRESL
BCF ADCON1, PCFG0 ; Configuración de la
BCF ADCON1, PCFG1 ; patilla RA1 como entrada
BSF ADCON1, PCFG2 ; analógica y voltaje de referencia
CARRERAS PROFESIONALES CIBERTEC
MICROCONTROLADORES
147
BCF ADCON1, PCFG3 ; VDD con GND
BSF TRISA,1 ; PORTA,1 IN
BCF TRISD,0 ; PORTD,0 OUT
BCF STATUS, RP0
BCF PORTD,0 ; FOCO APAGADO
BSF ADCON0, ADCS0 ; selección de la señal de
BCF ADCON0, ADCS1 ; reloj a F/8
BSF ADCON0, CHS0 ; selección de la
BCF ADCON0, CHS1 ; patilla RA1 como
BCF ADCON0, CHS2 ; canal de conversión
BSF ADCON0, ADON ; activa la conversión
NOP ; tiempo
NOP ; de espera
NOP ; para iniciar
NOP ; cada conversión
NEW BSF ADCON0, GO/DONE ; pone en marcha la conversión.
WAIT BTFSC ADON0,GO/DONE ; salta si culmina la conversión
GOTO WAIT ; sigue sensando fin de conversión
MOVFW ADRESH ; W = valor convertido
BCF STATUS, C ; limpia indicador de acarreo
SUBLW .191 ; resta a 191, W
BTFSC STATUS, C; salta si no se generó acarreo de suma
GOTO FOCOOFF ; salta a FOCOOFF para apagarlo
MOVFW ADRESH ; W = valor convertido
SUBLW .60 ; resta a 60, W
BTFSS STATUS, C; salta si se generó acarreo de resta
GOTO FOCOON ; salta a FOCON para prenderlo
GOTO NEW ; salta a NEW por una nueva conversión
FOCOOFF BSF PORTD,0 ; apaga el foco
GOTO NEW ; salta a NEW
FOCOON BCF PORTD,0 ; prende el foco
GOTO NEW ; salta a NEW
CIBERTEC CARRERAS PROFESIONALES
148
Resumen
Los puertos de comunicación serie transfieren la información bit a bit como el
desplazamiento de bits en un registro. La rapidez con la que se tratan estos bits
debe sincronizarse tanto en el transmisor como en el receptor de la información.
Uno de los tipos de comunicación serie que soporta el PIC16F877, es el conocido
USART (universal síncrono, asíncrono de recepción y transmisión). Este puede
trabajar de modo asíncrono transmitiendo y recibiendo información a la vez (full
duplex), mientras que en modo síncrono sólo trabaja transmitiendo o recibiendo
información (half duplex).
Los pines asociados para la transmisión y recepción de datos son RC6 y RC7
respectivamente y los registros asociados a la configuración son TXSTA y RCSTA,
mientras que los registros de datos son TXREG y RCREG. La velocidad de
comunicación la determina el registro SPBRG y el bit BRGH del registro TXSTA.
La conversión análoga digital del PIC16F877 posee hasta 8 canales distribuidos
entre los puertos A y E. Pero sólo uno de estos canales se puede convertir a la vez.
Es necesario, establecer el tipo de trabajo, digital ó analógico, que realizarán los
pines del puerto A y E antes de usar la conversión. El resultado binario de la
conversión está formado por 10 bits.
Los pines asociados a la conversión son RA0, RA1, RA2, RA3, RA5, RE0, RE1 y
RE2, los registros encargados de la configuración son ADCON0 y ADCON1 y los
registros que contienen el resultado de cada conversión son ADRESH y ADRESL.
Es necesario fijar la frecuencia de reloj según el cristal conectado al PIC, activar el
puerto de conversión y esperar unos 4us antes de realizar cada conversión.
Si desea saber más acerca de estos temas, puede consultar las siguientes
páginas.
8 [Link]
Aquí hallará información sobre la comunicación USART.
8 [Link]
Aquí hallará información sobre la conversión A/D.
CARRERAS PROFESIONALES CIBERTEC
MICROCONTROLADORES
149
UNIDAD DE
APRENDIZAJE
5
SEMANA
14
PROGRAMACIÓN DEL PIC16F877
LOGRO DE LA UNIDAD DE APRENDIZAJE
Al terminar la unidad, los alumnos podrán implementar circuitos aplicativos
basados en el PIC16F877. La polarización, reset, oscilación y los dispositivos de
salida se adaptarán al microcontrolador sin ningún tipo de.
Al terminar la unidad, los alumnos podrán desarrollar programas que pongan en
marcha el funcionamiento de circuitos aplicativos basados en el PIC16F877. Los
programas se realizarán en el computador, se transferirán al microcontrolador y
dejarán operativos al 100% la configuración y por lo menos al 80% la función
propuesta para la aplicación.
TEMARIO
Interrupciones
Desarrollo de programas
ACTIVIDADES PROPUESTAS
Los alumnos conectan los dispositivos al PIC.
Los alumnos configuran las interrupciones.
Los alumnos desarrollan las subrutinas de interrupción.
CIBERTEC CARRERAS PROFESIONALES
150
1 INTERRUPCIONES
Ya sabemos que las interrupciones son pedidos de atención que ciertos dispositivos
solicitan del Microprocesador. Los dispositivos que no poseen una actividad muy
frecuente, normalmente trabajan pidiendo la atención del microprocesador. Cuando
estos tienen alguna información disponible o requieren de esta, solicitan el servicio del
Microprocesador, el cual, lo atenderá a través de un programa relacionado con el
dispositivo. Normalmente, un programa principal se encarga de atender
constantemente a los dispositivos de actividad frecuente, mientras que, a los
dispositivos de baja actividad los atenderán las subrutinas de interrupción (programas
asociados).
1.1.1 Recordando el tratamiento de una interrupción
Mientras el Microprocesador se encuentra
ejecutando el programa principal, su
registro PC (contador de programa o
puntero de instrucciones) va avanzando
entre las direcciones de las instrucciones
de la FLASH, conforme estas se van
ejecutando. Suponga que el PC está
direccionando la celda 0250h y en ese
instante se presenta la interrupción de un
dispositivo. El Microprocesador culmina la
ejecución de la instrucción de la celda
0250h, avanza el PC a la siguiente
instrucción (0251h) y se guarda esta
dirección del PC en la PILA (buffer de
memoria temporal), truncando
temporalmente la ejecución del programa
principal. Enseguida el PC se carga con
el vector de interrupción 0004h de FLASH
y el Microprocesador empieza a ejecutar
las instrucciones a partir de esta
dirección, la cual, debe contener la
subrutina de atención del dispositivo.
Culminada la atención del dispositivo
(terminada la ejecución de la subrutina),
el PC recupera de la PILA la dirección
guardada (0251h) y retoma la ejecución
de las instrucciones del programa principal.
1.1.2 Fuentes de interrupción
El PIC16F877 tiene catorce posibles formas de sufrir interrupción:
- 2 generadas a través del PORTB
- 3 generadas por los desbordes de los timers/counters TMR0, TMR1 y TMR2
- 1 generada por la culminación de la conversión A/D
- 2 generadas por la transmisión y recepción serie tipo USART
- 1 generada por la transmisión o recepción serie síncrona SSP
- 1 generada por la escritura sobre la memoria EEPROM
- 1 generada por la transferencia sobre el puerto esclavo paralelo PSP
- 2 generados por los módulos de captura y comparación CCP
- 1 generada por la colisión del bus serie
CARRERAS PROFESIONALES CIBERTEC
MICROCONTROLADORES
151
Cualquiera que cause la interrupción obligará la modificación del PC al vector 0004h.
De aquí, se tiene que averiguar ¿Cuál de las catorce posibles fuentes causó la
interrupción? para ejecutar la subrutina de interrupción relacionada. Cada fuente de
interrupción tiene un indicador de interrupción asociado, el cual, se pone a 1 indicando
su presencia, este indicador debe limpiarse luego de ejecutada la subrutina de
interrupción.
1.1.3 Habilitación de las interrupciones
Las fuentes de interrupción sólo pueden obligar al PC direccionar al vector 0004h, si
estas se han configurado y habilitado. De no haberse realizado tal paso, las fuentes
jamás podrán interrumpir y por lo tanto no podrán ser atendidas.
Los registros especiales encargados del tratamiento de las interrupciones son el
registro INTCON, OPTION_REG, PIE1, PIR1, PIE2 y PIR2. Veamos la descripción de
sus bits a continuación:
[Link] Registro INTCON
GIE PEIE T0IE INTE RBIE T0IF INTF RBIF
bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
GIE: Habilitador global de las interrupciones
1: Habilitado
0: Deshabilitado
PEIE: Habilitador de interrupción de los periféricos
1: Habilitado
0: Deshabilitado
T0IE: Interrupción por desbordamiento del TIMER0
1: Habilitado
0: Deshabilitado
INTE: Interrupción externa del pin RB0/INT
1: Habilitado
0: Deshabilitado
RBIE: Interrupción por variación del valor de los bits <RB4:RB7>
1: Habilitado
0: Deshabilitado
T0IF: Indicador de interrupción de desbordamiento del TIMER0
1: Activado
0: Desactivado
INTF: Indicador de interrupción del pin RB0/INT
1: Activado
0: desactiva
RBIF: Indicador de interrupción por variación del valor de los bits <RB4:RB7>
1: Activado
0: Desactivado
CIBERTEC CARRERAS PROFESIONALES
152
[Link] Registro OPTION
RBPU INTDEG T0CS T0SE PSA PS2 PS1 PS0
bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
INTEDG: Selector del tipo de interrupción externa RBO/INT
1: activa por flanco ascendente
0: activa por flanco descendente
[Link] Registro PIE1
PSPIE1 ADIE RCIE TXIE SSPIE CCP1IE TMR2IE TMR1IE
bit7 bit6 bit5 bit4 bit3 bit2 bit1 Bit0
PSPIE : Interrupción por lectura/escritura del puerto paralelo esclavo
0: Deshabilitado
1: Habilitado
ADIE : Interrupción por conversión análoga digital
0: Deshabilitado
1: Habilitado
RCIE: Interrupción por USART recepción
0: Deshabilitado
1: Habilitado
TXIE: Interrupción por USART transmisión
0: Deshabilitado
1: Habilitado
SSPIE: Interrupción por transmisión o recepción serie síncrona
0: Deshabilitado
1: Habilitado
CCP1IE: Interrupción del módulo de captura comparación y fase 1
0: Deshabilitado
1: Habilitado
TMR2IE: Interrupción por Igualdad del timer2 con el registro PR2
0: Deshabilitado
1: Habilitado
TMR1IE: Interrupción por desbordamiento del TMR1
0: Deshabilitado
1: Habilitado
[Link] El Registro PIR1
PSPIF ADIF RCIF TXIF SSPIF CCP1IF TMR2IF TMR1IF
bit7 bit6 bit5 bit4 bit3 bit2 bit1 Bit0
CARRERAS PROFESIONALES CIBERTEC
MICROCONTROLADORES
153
PSPIF: Indicador de interrupción de lectura/escritura del puerto paralelo esclavo
1: Una operación de lectura o escritura ha culminado
0: Lectura o escritura en proceso
ADIF: Indicador de interrupción de la conversión análoga digital
1: Una operación de conversión ha culminado
0: Conversión aun sin completar
RCIF: Indicador de interrupción USART recepción
1: El buffer de recepción USART esta lleno
0: Buffer aun por llenar
TXIF: Indicador de interrupción USART transmisión
1: El buffer de transmisión USART esta vació
0: Buffer aun por vaciar
SSPIF: Indicador de interrupción del puerto serie síncrono
1: Una transmisión o recepción completa ha tenido lugar
0: Transmisión o recepción aun por procesar
CCP1IF: Indicador de interrupción del módulo de captura comparación y fase 1
1: Una operación de captura o comparación del timer 1 ha ocurrido
Esta ocurrencia resetea al timer 1
0: Aun no ha ocurrido el proceso
TMR2IF: Indicador de interrupción por igualdad del timer2 con el registro PR2
1: La igualdad del timer 2 y del registro PR2 se dio
0: Tal igualdad aun no se da
TMR1IF: Indicador de interrupción por desbordamiento del timer 1
1: El timer uno se ha desbordado
0: El desbordamiento aun no sucede
[Link] El Registro PIE2
- - - EEIE BCLIE - - CCP2IE
bit7 bit6 bit5 bit4 bit3 bit2 Bit1 Bit0
EEIE: Interrupción de escritura de la EEPROM
0: Deshabilitado
1: Habilitado
BCLIE: Interrupción por colisión de bus del puerto serie síncrono
0: Deshabilitado
1: Habilitado
CCP2IE: Interrupción del módulo de captura, comparación y fase 2
0: Deshabilitado
1: Habilitado
[Link] El Registro PIR2
CIBERTEC CARRERAS PROFESIONALES
154
- - - EEIF BCLIF - - CCP2IF
Bit7 bit6 bit5 bit4 bit3 bit2 Bit1 Bit0
EEIF: Indicador de interrupción de escritura de la EEPROM
1: El proceso de escritura ha culminado
0: La escritura aun no termina
BCLIF: Indicador de interrupción por colisión de bus del puerto serial síncrono
1: Colisión de bus generada
0: No hay colisión
CCP2IF: Indicador de interrupción del módulo de captura, comparación y fase 2
1: Una operación de captura o comparación del timer 1 ha ocurrido.
Esta ocurrencia resetea al timer 1 y genera un proceso de conversión
análoga digital si el modulo de conversión esta habilitada.
0: No ha ocurrido aún el proceso
1.2 Secuencia de configuración
Las interrupciones, para ser habilitadas, deben realizarse teniendo en cuenta los
siguientes pasos:
1. Activar el bit de interrupción o bits de interrupción asociados a la fuente o fuentes.
2. Activar el habilitador de interrupción de periféricos.
3. Activar el habilitador global de interrupciones.
Supongamos que se desea habilitar la interrupción del TMR1 y la conversión A/D. La
secuencia sería:
BSF PIE1, TMR1IE ;Activa interrupción del TMR1
BSF PIE1, ADIE ;Activa interrupción del canal de conversión A/D
BSF INTCON, PEIE ;Habilita la interrupción de los periféricos
BSF INTCON, GIE ;Habilita todas las interrupciones
CARRERAS PROFESIONALES CIBERTEC
MICROCONTROLADORES
155
1.3 Desarrollo de programas
1.3.1 Interrupción por variación de los bits RB4 - RB7
Realice el programa que permita mostrar sobre los 4 leds del puerto C una cuenta
ascendente repetitiva desde 0 hasta el valor indicado en los switches del puerto B.
Este límite de la cuenta, indicado en los switches, debe mostrarse sobre los leds del
puerto D cada vez que varíe.
Desarrollemos el programa:
VARY EQU 0X40
VARZ EQU 0X41
LIMITE EQU 0X42
ORG 0X0000
RESET GOTO INICIO
ORG 0X0004
VECTOR GOTO SINT
INICIO BSF STATUS, RP0 ; Selección del Banco 1
CLRF TRISD ; OUT PORTD
CLRF TRISC ; OUT PORTC
BSF TRISB,4 ; IN PORTB,4
BSF TRISB,5 ; IN PORTB,5
BSF TRISB,6 ; IN PORTB,6
BSF TRISB,7 ; IN PORTB,7
BSF INTCON, GIE ; Habilitación de interrupciones
CIBERTEC CARRERAS PROFESIONALES
156
BSF INTCON, PEIE ; Habilitación de interrupción de periféricos
BSF INTCON, RBIE ; Habilitación de la interrupción por variación
BCF STATUS, RP0 ; Selección del Banco 0
MOVFW PORTB ; W = DIPSWITCHES
MOVWF LIMITE ; LIMITE = W
BCF STATUS, C ; limpia el carry
RRF LIMITE ; Pasa el valor
RRF LIMITE ; que se encuentra
RRF LIMITE ; en los cuatro bits mas significativos
RRF LIMITE ; a los cuatro bits menos significativos
MOVFW LIMITE ; W = LIMITE
MOVWF PORTD ; PORTD = W (límite de la cuenta)
REINICIA CLRF PORTC ; leds de la cuenta ascendente a 0
CALL DELAY ; tiempo de visualización de cada número
INCF PORTC ; aumenta en 1 el valor del puerto C
MOVFW PORTC ; W = PORTD
XORFW LIMITE ; OREXCLUSIVA DEL LIMITE CON EL PORTC
BTFSS STATUS, Z ; salta si fueron iguales a CTA0
GOTO SIGUE ; sigue contando
CTA0 GOTO REINICIA ; reinicia en 0 la cuenta
DELAY MOVLW 0X05 ; SUBRUTINA DE TEMPORIZADO
MOVWF VARY
IVZ MOVLW 0XFF
MOVWF VARZ
DVZ DECFSZ VARZ
GOTO DVZ
DECFSZ VARY
GOTO IVZ
RETURN
SINT MOVFW PORTB ; W = DIPSWITCHES
BCF STATUS, C ; Carry = 0
MOVWF LIMITE ; LIMITE = W
RRF NUMERO ; Pasa el valor
RRF NUMERO ; que se encuentra
RRF NUMERO ; en los cuatro bits más significativos
RRF NUMERO ; a los cuatro bits menos significativos
MOVFW LIMITE ; W = LIMITE
MOVWF PORTD ; PORTD = W (nuevo límite de cuenta)
BCF INTCON, RBIF ; Se limpia el indicador de interrupción
RETFIE ; Finaliza la subrutina de interrupción
CARRERAS PROFESIONALES CIBERTEC
MICROCONTROLADORES
157
1.3.2 Monitoreo y control de temperatura
Realice el programa que permita activar o desactivar el encendido de un horno. Las
temperaturas de referencia se encuentran ubicadas en dos posiciones de memoria
ram: 60h y 61h, temperatura baja y alta respectivamente. La temperatura del horno se
simula con la variación del estado del potenciómetro. Si la temperatura medida supera
el limite alto, debe apagar el horno, mientras que si la temperatura es menor al limite
bajo, debe encenderlo. Este control debe realizarse tomando muestreos de la
temperatura cada 50ms, para lo cual debe programar al TMR1. La temperatura actual
debe ser mostrada sobre los leds del puerto B.
Para la conversión A/D, se utilizará la señal de reloj F/8 ya que está se configura hasta
frecuencias máximas de cristal de 5Mhz y según el esquema el cristal es de 4Mhz. El
voltaje de referencia será VDD y GND y el formato de conversión debe ser 8 bits
ADRESH y 2 bits ADRESL. Los valores convertidos en ADRESH servirán para tomar
la decisión de apagar o encender el foco. Cualquier valor menor al contenido de la
celda de ram 60h prenderá el foco y cualquier valor mayor al contenido de la celda 61h
lo apagará.
Para el TMR1, este debe ser programado para generar una base de tiempo de 50ms,
la cual servirá para iniciar los procesos de conversión.
Recordemos que el tiempo se calcula:
T= (4*factor de división*pulsos a contar)/f
Veamos:
Considerando el factor máximo de división (8) y la frecuencia del cristal de 4Mhz
(según el esquema), los pulsos a contabilizar serían:
Pulsos a contar = T*f/4*factor de división = 50ms*4000Khz/4*8 = 6,250
Pero, el valor inicial de los registros de trabajo se obtiene como 65,536 – 6,250
CIBERTEC CARRERAS PROFESIONALES
158
Y 59286 a hexadecimal es E796. Por lo tanto: TMR1H = E7h y TMR1L = 96h
Los leds ROJO, VERDE y AMARILLO son los indicadores de la temperatura del horno.
El rojo indicará que la temperatura a superado el nivel de referencia alto, el amarillo
indicará que la temperatura es menor al nivel de referencia bajo y el color verde
indicará que la temperatura se encuentra entre el nivel alto y bajo de referencia.
Iniciamos el desarrollo del programa:
BAJO EQU 0X60 ;variable de referencia alto
ALTO EQU 0X61 ;variable de referencia bajo
ORG 0X0000
GOTO INICIO
ORG 0X0004
GOTO SINT
INICIO BSF STATUS, RP0
BCF STATUS, RP1
BCF ADCON1, ADFM ; Formato 8 bits ADRESH y 2 bits ADRESL
BCF ADCON1, PCFG0 ; Configuración de la
BCF ADCON1, PCFG1 ; patilla RA1 como entrada
BSF ADCON1, PCFG2 ; analógica y voltaje de referencia
BCF ADCON1, PCFG3 ; VDD con GND
BSF TRISA,1 ; PORTA,1 IN
BCF TRISD,0 ; PORTD,0 OUT
BSF PIE1, TMR1IE ; activa la interrupción del TMR1
BSF INTCON, GIE ; activa la interrupción global
BSF INTCON, PEIE ; activa la interrupción de los periféricos
CLRF TRISB ; PORTB OUT
BCF STATUS, RP0 ;
BCF PORTD,0 ; HORNO APAGADO
CLRF PORTB ; LEDS APAGADOS
MOVLW .200 ; NIVEL ALTO
MOVWF ALTO ; = 200
MOVLW .80 ; NIVEL BAJO
MOVWF BAJO ; = 80
BCF ESTADO,0 ; estado del horno apagado
CONFAD BSF ADCON0, ADCS0 ; selección de la señal de
BCF ADCON0, ADCS1 ; reloj a F/8
BSF ADCON0, CHS0 ; selección de la
BCF ADCON0, CHS1 ; patilla RA1 como
BCF ADCON0, CHS2 ; canal de conversión.
BSF ADCON0, ADON ; activa la conversión
CONFT1 BCF T1CON, TMR1CS ; elección del clock interno f/4
BSF T1CON, T1CKPS0 ; elegir el factor 8
BSF T1CON, T1CKPS1 ; de división
MOVLW 0X96 ; inicializar los registros de trabajo
MOVWF TMR1L ; TMR1L = 96
MOVLW 0XE7 ;
MOVWF TMR1H ; TMR1H = E7
CARRERAS PROFESIONALES CIBERTEC
MICROCONTROLADORES
159
BSF T1CON, TMR1ON ; TMR1 en marcha
HIGHLEVEL MOVFW ADRESH ; W = temperatura del horno
BCF STATUS, C ; limpia indicador de acarreo
SUBWF 0X61,0 ; resta a (61h) ADRESH
BTFSC STATUS, C; salta a LOWLEVEL si no hay acarreo
GOTO HORNOFF ; salta a HORNOFF para apagarlo
LOWLEVEL MOVFW ADRESH ; W = temperatura del horno
SUBWF 0X60,0 ; resta a (60h) ADRESH
BTFSS STATUS, C; salta a NORMAL si hay acarreo
GOTO HORNON ; salta a HORNON para prenderlo
NORMAL BCF PORTB,0 ; led Amarillo off
BSF PORTB,1 ; led verde on
BCF PORTB,2 ; led rojo off
GOTO HIGHLEVEL ; repite el proceso desde HIGHLEVEL
HORNOFF BSF PORTD,0 ; apaga el horno
BCF PORTB,0 ; led Amarillo off
BCF PORTB,1 ; led verde off
BSF PORTB,2 ; led rojo on
GOTO HIGHLEVEL ; repite el proceso desde HIGHLEVEL
HORNON BCF PORTD,0 ; prende el horno
BSF PORTB,0 ; led Amarillo on
BCF PORTB,1 ; led verde off
BCF PORTB,2 ; led rojo off
GOTO HIGHLEVEL ; repite el proceso desde HIGHLEVEL
SINT BCF PIR1, TMRIF ; limpia indicador de interrupción
MOVLW 0X96 ; inicializar los registros de trabajo
MOVWF TMR1L ; TMR1L = 96
MOVLW 0XE7 ;
MOVWF TMR1H ; TMR1H = E7
BSF ADCON0, GODONE ; inicia otra conversión A/D
RETFIE
1.3.3 Monitoreo de un teclado matricial
CIBERTEC CARRERAS PROFESIONALES
160
Realice el programa que permita mostrar sobre el display de cristal líquido la tecla
presionada. El barrido sobre las filas (F1, F2, F3 y F4) se realizara cada 50ms, para lo
cual programaremos al TMR1 para generar esta base de tiempo. Nos enteraremos
que se ha presionada una tecla activando la interrupción por variación de los pines
<RB4 _RB7>. La tecla presionada se obtendrá al combinar los valores de la última fila
activada y el valor de la columna activada.
Para configurar el TMR1, recordemos que el tiempo se calcula:
T= (4*factor de división*pulsos a contar)/f
Veamos:
Considerando el factor máximo de división (8) y la frecuencia del cristal de 4Mhz
(según el esquema), los pulsos a contabilizar serían:
Pulsos a contar = T*f/4*factor de división = 50ms*4000Khz/4*8 = 6,250
Pero, el valor inicial de los registros de trabajo se obtiene como 65,536 – 6,250
Y 59286 a hexadecimal es E796. Por lo tanto: TMR1H = E7h y TMR1L = 96h
Iniciemos el programa
BAJO EQU 0X60 ;variable de referencia alto
ALTO EQU 0X61 ;variable de referencia bajo
VARY EQU 0X62
VARZ EQU 0X63
DATOC EQU 0X64
DATOF EQU 0X65
TECLA EQU 0X66
ESTADO EQU 0X67
CARRERAS PROFESIONALES CIBERTEC
MICROCONTROLADORES
161
ORG 0X0000
GOTO INICIO
ORG 0X0004
GOTO SINT
INICIO BSF STATUS, RP0
BCF STATUS, RP1
CLRF TRISD ; PORTD OUT (datos del display)
CLRF TRISC ; PORTC OUT (control display/filas teclado)
MOVLW .255 ; W = 255 = 11111111b
MOVWF TRISB ; PORTB IN
BSF INTCON, RBIE ; activa interrupción <RB4-RB7>
BSF PIE1, TMR1IE ; activa la interrupción del TMR1
BSF INTCON, GIE ; activa la interrupción global
BSF INTCON, PEIE ; activa la interrupción de los periféricos
BCF STATUS, RP0 ;
CLRF PORTC
CONFT1 BCF T1CON, TMR1CS ; elección del clock interno f/4
BSF T1CON, T1CKPS0 ; elegir el factor 8
BSF T1CON, T1CKPS1 ; de división
MOVLW 0X96 ; inicializar los registros de trabajo
MOVWF TMR1L ; TMR1L = 96
MOVLW 0XE7 ;
MOVWF TMR1H ; TMR1H = E7
BSF T1CON, TMR1ON ; TMR1 en marcha
CALL FUNSET ; subrutinas
CALL ENMSET ; de
CALL DCTRL ; configuración
CALL CLRD ; del
CALL CHOME ; LCD
NEWT CALL LEET ; w = tecla presionada
CALL WDATA ; escribe en el display la tecla presionada
GOTO NEWT ;salta para repetir
FUNSET MOVLW b'00111000'
MOVWF DATO
CALL CONFD
RETURN
ENMSET MOVLW b'00000110'
MOVWF DATO
CALL CONFD
RETURN
DCTRL MOVLW b'00001110'
MOVWF DATO
CALL CONFD
RETURN
CLRD MOVLW b'00000001'
MOVWF DATO
CALL CONFD
CIBERTEC CARRERAS PROFESIONALES
162
RETURN
CHOME MOVLW b'00000010'
MOVWF DATO
CALL CONFD
RETURN
CONFD BCF PORTC,1
BCF PORTC,2
CALL DELAY
BSF PORTC,0
CALL DELAY
MOVFW DATO
MOVWF PORTD
CALL DELAY
BCF PORTC,0
CALL DELAY
BSF PORTC,1
BSF PORTC,2
CALL DELAY
RETURN
LEET BTFSS ESTADO,0
GOTO LEET
BCF ESTADO,0
MOFW TECLA
RETURN
WDATA MOVWF PORTD
BSF PORTC,2
BCF PORTC,1
CALL DELAY
BSF PORTC,0
CALL DELAY
CALL DELAY
BCF PORTC,0
CALL DELAY
BCF PORTC,2
BSF PORTC,1
CALL DELAYT
BCF INTCON, RBIF
BSF INTCON, RBIE ; activa interrupción <RB4-RB7>
RETURN
DELAY MOVLW 0X05
MOVWF VARY
IVZ MOVLW 0XFF
MOVWF VARZ
DVZ DECFSZ VARZ
GOTO DVZ
DECFSZ VARY
GOTO IVZ
RETURN
SINT BTFSC PIR1,TMR1IF
CARRERAS PROFESIONALES CIBERTEC
MICROCONTROLADORES
163
GOTO STMR1
NTFSC INTCON,RBIF
GOTO STECLA
RETFIE
STMR1 BCF PIR1,TMR1IF ; limpia indicador de interrupción del TMR1
MOVLW 0X96 ; inicializar los registros de trabajo
MOVWF TMR1L ; TMR1L = 96
MOVLW 0XE7 ;
MOVWF TMR1H ; TMR1H = E7
BTFSC PORTC,4
GOTO ONF3
BTFSC PORTC,3
GOTO ONF2
BTFSC PORTC,2
GOTO ONF1
BTFSC PORTC,1
GOTO ONF4
GOTO ONF4
ONF3 BCF PORTC,4
BSF PORTC,3
BCF PORTC,2
BCF PORTC,1
RETFIE
ONF2 BCF PORTC,4
BCF PORTC,3
BSF PORTC,2
BCF PORTC,1
RETFIE
ONF1 BCF PORTC,4
BCF PORTC,3
BCF PORTC,2
BSF PORTC,1
RETFIE
ONF4 BSF PORTC,4
BCF PORTC,3
BCF PORTC,2
BCF PORTC,1
RETFIE
STECLA BCF INTCON, RBIE
BCF INTCON, RBIF
MOVFW PORTB ; W = columnas del teclado
ANDLW 0X70 ; enmascara la información
BTFSC STATUS,Z ; salta si se altivo alguna columna
GOTO SALIDA ; salta a SALIDA porque se liberó la tecla press
MOVWF DATOC ; DATOC = columnas
CIBERTEC CARRERAS PROFESIONALES
164
BCF STATUS,C ; limpia indicador de arrastre.
ROR DATOC ; Desplaza la información de DATOC
ROR DATOC ; hacia la posición de los bits menos
ROR DATOC ; significativos para formar los números
ROR DATOC ; 0, 1 ó 2. Estos se usarán en N048 para
ROR DATOC ; desplazar al PC y formar 0, 4 ú 8 según la
; columna activada.
CALL N048 ; Forma los números. W = 0, 4 u 8
MOVWF TECLA ; TECLA = W
MOVFW PORTC ; W = filas del teclado
MOVWF DATOF ; DATOF = filas
BCF STATUS,C ; limpia indicador de arrastre
ROR DATOF ; Desplaza la información de DATOF
ROR DATOF ; haciala posición de los bits menos
ROR DATOF ; significativos para formar los números
ROR DATOF ; 0, 1, 2 ó 4. Estos se usarán en N0123
ROR DATOF ; para desplazar al PC y formar 0, 1, 2 ó 3
; según la fila activada.
CALL N0123 ; Forma los números. W = 0,1,2 o 3
ADDWF TECLA ; TECLA = TECLA + W
BSF ESTADO,0 ; activa indicador de tecla presionada
RETFIE
N048 MOVFW DATOC
ADDWF PCL,1
RETLW .0
RETLW .4
RETLW .8
N0123 MOVFW DATOF
ADDWF PCL,1
RETLW .0
RETLW .1
RETLW .2
RETLW .3
RETLW .3
SALIDA CALL DELAYT
RETFIE
CARRERAS PROFESIONALES CIBERTEC
MICROCONTROLADORES
165
Resumen
El PIC16F877 posee catorce fuentes de interrupción: Dos de estas se pueden
generar a través del PORTB, 3 por el tratamiento de los timers TMR0, TMR1 y
TMR2, 1 por la conversión A/D, 2 por la comunicación USART, 1 por la
comunicación serie SSP, 1 por la escritura sobre EEPROM, 1 por la transferencia
sobre el puerto PSP, 2 por los módulos captura, comparación y fase, y una
generada por la colisión del bus serie.
Estas fuentes deben habilitarse para que realmente puedan interrumpir. El registro
INTCON, PIE1, PIE2, PIR1 y PIR2 contienen los bits de habilitación y los bits
indicadores de la presencia de interrupción.
Cada vez que se produce una interrupción, el PC, detiene temporalmente la
ejecución del programa en curso y direcciona el vector 0004h de memoria FLASH
para ejecutar las subrutinas de interrupción. Culminada esta atención, retoma la
ejecución del programa detenido.
Para saber cual de las catorce fuentes a interrumpido, debemos verificar los bits
indicadores de la presencia de interrupción. De este modo, sabremos que subrutina
ejecutar para lograr la atención. Una vez culminada la ejecución debemos limpiar el
bit indicador de interrupción respectivo.
Si desea saber más acerca de estos temas, puede consultar las siguientes
páginas.
8[Link]
Aquí hallará información sobre las interrupciones
8[Link]
option=com_docman&task=cat_view&gid=14&dir=DESC&order=name&Itemid=27&limi
t=5&limitstart=5
Aquí hallará información sobre automatización de casas
CIBERTEC CARRERAS PROFESIONALES