Está en la página 1de 17

1

ADC, EEPROM,
INTERRUPCIONES PIC 16F877a
Experiencia de Laboratorio N°3
MICROPROCESADOES
(Julio de 2021)
José Miguel Aramburú Hernández, Ismael Roberto Acevedo Pavez

su interior las tres principales unidades funcionales de una


Resumen - Se propone el estudio del microprocesador computadora: unidad central de procesamiento, memoria y
P16F877A, perteneciente a una subfamilia de los periféricos de entrada/salida.
microcontroladores PIC, fabricado por Microchip, atendiendo sus
características generales, entendiendo sus formatos y
configuraciones básicas y aplicando dichas características en la
Algunos microcontroladores pueden utilizar palabras de cuatro
solución de desafíos propuestos mediante la programación en bits y funcionan a velocidad de reloj con frecuencias tan bajas
ASSAMBLER (ensamblador). como 4 kHz, con un consumo de baja potencia (mW o micro
watts). Por lo general, tendrá la capacidad de mantenerse a la
espera de un evento como pulsar un botón o de otra
interrupción; así, el consumo de energía durante el estado de
I. OBJETIVOS reposo (reloj de la CPU y los periféricos de la mayoría) puede
ser solo de nano Watts, lo que hace que muchos de ellos sean
Desarrollar distintas aplicaciones utilizando los módulos de muy adecuados para aplicaciones con batería de larga duración.
conversión analógica digital, la memoria de datos no volátil Otros microcontroladores pueden servir para roles de
EEPROM y el sistema de interrupciones del microcontrolador rendimiento crítico, donde sea necesario actuar más como un
PIC16F877A. procesador digital de señal (DSP), con velocidades de reloj y
consumo de energía más altos. [2]
En el siguiente trabajo se desarrollará la respuesta del
II. INTRODUCCIÓN microcontrolador a distintas configuraciones de pulsador, desde
una entrada compuesta por relés, hasta una compuesta por u
Los microprocesadores y microcontroladores representan la teclado matricial 4x4.
maravilla del desarrollo de la tecnología electrónica en más de
medio siglo, los aparatos que los incorporan han cambiado la
forma de trabajar e investigar de la humanidad, en la historia El Microcontrolador PIC16F877a
ninguna herramienta creada por el hombre, tenía la capacidad
de crear otras y acelerar su evolución, en la actualidad muchos El microcontrolador PIC16F877A es un dispositivo
instrumentos, electrodomésticos y en general cualquier programable que se compone de una computadora digital, una
dispositivo electrónico utiliza alguno de estos dos componentes
unidad de memoria de datos, una unidad de memoria de
para optimizar su funcionamiento. [1]
programa y puertos de entrada/salida en un circuito integrado,
El microcontrolador funciona como un controlador de periféricos en un sistema
mínimo. El microcontrolador depende de una alimentación de
Como se explicó en trabajos anteriores, un microcontrolador al menos 5V y 0V en sus entradas de Vdd y Vss
(abreviado µC, UC o mCU) es un circuito integrado respectivamente para su operación, requiere de una señal de
programable, capaz de ejecutar las órdenes grabadas en su reloj que le indique la frecuencia de trabajo, está señal la
memoria. Está compuesto de varios bloques funcionales que introducimos a través de un oscilador de cristal de cuarzo, y una
cumplen una tarea específica. Un microcontrolador incluye en alimentación al pin MCLR, que es un pin de reset que activa al
2

microcontrolador. • Salidas del comparador accequibles.


El funcionamiento del microcontrolador está determinado por
un programa almacenado en su memoria Flash ROM y puede Descripción de los Pines.
programarse más de una vez para cambiar su estado y su
comportamiento, lo que lo convierte al microcontrolador en una La descripción de los pines depende del tipo de empaque, el
pieza esencial en el rápido desarrollo de aplicaciones PIC16F877a puede venir en las siguientes configuraciones:
electrónicas. [3] 𝐏𝐃𝐈𝐏 − 𝐏𝐋𝐂𝐂 − 𝐓𝐐𝐅𝐏 − 𝐐𝐅𝐍
Cabe destacar que la terminación “a” en el PIC16F877a indica
que el modelo tiene comparador lógico, y la “F” indica la
utilización de memoria flash.

Características del PIC16F877a Figura 1 ilustra las formas en las que puede venir empaquetado el
PIC16F877a.

• Velocidad de Operación DC - 20 MHz.


• Ciclo de instrucción DC - 20o ns. Para este caso, se usará el PIC16F877a con un empaquetado
• Set de Instrucciones 35. tipo PDIP, de 100 mils de separación entre pines y de 600 mils
• Toda las Instrucciones de 1 ciclo, excepción saltos de de ancho; esta variedad de micro, con 40 pines es el que
2 ciclos. comúnmente se usa en protoboards para proyectos.
• Memoria de Programa (FLASH) 8K x 14 words.
• Memoria de Datos 368 x 8 bytes.
• Memoria de EEPROM 256 x 8 bytes.
• Pin-Out compatible con otros MCU de 28 o 40/44 pin
grupos PIC16CXXX y PIC16FXXX

PERIFERICOS

• 3 TIMERS (Timer0,1,2)
• Timer0: 8 bit temporizador/contador con 8 bit
prescaler.
• Timer1: 16 bit temporizador/contador con prescaler
puede ser incrementado durante Sleep con clock
externo.
• Timer2: 8 bit temporizador/contador con 8 bit registro
de periodo prescaler y postscaler.
• 2 CCP (Capture/compare/PWM)
• Captura es de 16bit, máxima resolución es de 12.5ns
• Compare es de 16bit, máxima resolución es de 200ns
Figura 2 ilustra el PIC16F877a con sus pines.
• PWM con máxima resolución de 10 bit
• SSP (Sinchronous Serial Port)
Arquitectura Interna
• SPI (Modo Maestro), I2C (Modos: Maestro/Esclavo)
• USART/SCI (Universal Synchronous Asynchronous
El PIC16F877a es un procesador tipo RICS que es un
Receiver) con 9 bit de detección de dirección.
procesador de instrucciones reducidas, por su pequeño número
• PSP Puerto Paralelo Esclavo (Parallel Slave Port) de 8
bit con controles RD, WR y CS (40/44 pin). de instrucciones, además casi todas se realiza en la misma
• CAD (Conversor Análogo a Digital) de 10 bit, hasta 8 cantidad de tiempo, posee unidades que trabajan en paralelo
canales. conectadas por pipes o tuberías. Este procesador emplea una
arquitectura Harvard lo que significa que trabaja las zonas de
Módulo de Comparadores Análogos memoria de programa y datos en forma separada. [4]

• 2 comparadores análogos.
• Basado arquitectura Harvard.
• Programable Modulo de voltaje de referencia (Vref)
• 8 formas de configuración con entradas, salidas y
referencia.
3

Diagrama de Bloques

Figura 3 ilustra la arquitectura Harvard para el PIC16F877a.

Puertos y Periféricos

Los pines pueden o no tener conectado un periférico de acuerdo


con los requerimientos u necesidades, e incluso pueden estar
conectado a más de uno o compartirlo.
Para la configuración de cada periférico se debe usar
correctamente los registros asociados en un procedimiento
secuencial, para el caso del PIC16F84a, contiene los siguientes
periféricos.
Tabla1

Figura 4 ilustra el diagrama de bloques para el PIC16F874-77.

Es aconsejable usar solo un periférico por pin, debido a que se En la parte intermedia encontramos el Status Reg. que es el
puede comprometer la MCU y dañar los pines en caso de registro de estado encargado de anotar el estado actual del
confundir entradas con salidas, generando un cortocircuito y sistema, cada vez que se ejecuta una instrucción se llevan a cabo
dañando el mofset de salida del puerto. [5] cambios dentro del PIC 16F877A como desborde, acarreo, etc.
Cada uno de esos eventos está asociado a un bit de este registro.
De forma general, el PIC16F877a es una pastilla integrada de
40 pines, de los cuales 33 pines conforman los cinco puertos Existe el Program Counter o contador de programa este
bidireccionales, mientras que los siete restantes se emplean en registro indica la dirección de la instrucción a ejecutar. El
el circuito oscilador (2), alimentación (4) y el circuito de reset. registro en cuestión no es necesariamente secuencial, esto es no
[1] se incrementa necesariamente de uno en uno ya que puede darse
el caso en el que salte dependiendo si hay una instrucción de
bifurcación de por medio o puede haber alguna instrucción de
llamada a función y/o procedimiento. También tenemos el
bloque de la pila, cuya función es ser un buffer temporal en el
que se guarda el contador de programa cada vez que se suscita
una llamada a un procedimiento y/o función (incluyendo
interrupciones). Por tanto, el nivel de anidamiento es de hasta 8
llamadas. [4]

Organización de Memoria

Se distinguen dentro del PIC16F877a, tres tipos de memoria: la


memoria de programa, memoria de datos ram y la memoria
EEPROM de datos.

Memoria de datos: Posee cuatro bancos de memoria, es donde


se almacenan todos los registros propios del usuario y del
MCU, los cuales se dividen en:
4

GPR (General Purpose Registers): Los cuales corresponden a


los registros donde se almacenan los datos de usuario.
SFR (Special Function Registers): Asociados a los registros
propios del MCU, periféricos u puertos y funcionamiento
general del MCU; generan banderas, habilitación de
interrupciones, lectura y escritura de valores, etc. [5]

Figura 6 ilustra el mapa de memoria de programa para el PIC16F877a.

El contador de programa PC de 13 bits, con 8192 posiciones


(213 ) puede recorrer todo el mapa de memoria del programa,
Cada posición puede alojar una instrucción, perteneciente a un
programa. El ancho de cada instrucción se denomina palabra
(word) que para este MCU es de 14 bits. [5]
Los 8K de memoria de programa disponible están divididos en
4 páginas de 2K cada una (0h–7FFh, 800h-FFFh, 1000h17FFh
Figura 5 ilustra el mapa de registros para el PIC16F877a. y 1800h-1FFFh). Esto es debido a que las instrucciones de salto
y llamada a subprograma permiten cargar sólo 11 bits en el PC
(desplazamiento en 211 = 2K). Si se están ejecutando
Memoria EEPROM instrucciones secuencialmente, el contador de programa pasará
de una página a otra sin necesidad de intervención por parte del
Es una memoria de datos de usuario que tiene la particularidad usuario o programador.
de no borrarse si falta la alimentación de voltaje. Por tanto, es Para saltar entre páginas de la memoria de programa los 2 bits
muy útil en el momento de realizar tablas de datos que se van más altos del PC deben modificarse. Esto se realiza escribiendo
construyendo a medida que el programa va generando estos en el registro PCLATH (es un registro situado en la memoria
datos, de tal manera que se puedan guardar como parámetros de de datos). [6]
calibración o funcionamiento del dispositivo.
No es posible acceder a estos datos mediante un El LCD
direccionamiento, ya que están ubicados más allá de lo Una LCD es una pantalla delgada y plana formada por un
permitido, para acceder a ellos es necesario realizar un número de píxeles en color o monocromos colocados delante
procedimiento. [5] de una fuente de luz o reflectora. A menudo se utiliza en pilas
o dispositivos electrónicos, ya que utiliza cantidades muy
Memoria de Programa pequeñas de energía eléctrica.

En la memoria de programa se almacena el programa con el que Estos dispositivos se basan en el empleo de cristales líquidos
el MCU funcionará. (LC). Son materiales que no tienen un punto de fusión definido.
Es decir, por debajo de un valor característico de la temperatura
fluyen como los líquidos, pero guardando las moléculas entre sí
una ordenación como la que se da en los cristales. Sus
propiedades se ven afectadas por las fuerzas mecánicas, los
campos eléctricos o magnéticos, el entorno químico o el nivel
5

térmico. [7] también están disponibles mediante ROM programada con


máscara. [8]

DDRAM y CGROM

La memoria DDRAM (Data Display RAM): corresponde a una


zona de memoria donde se almacenan los caracteres que se van
a representar en pantalla. Es decir, es la memoria donde se
almacenan los caracteres a mostrar con su correspondiente
posición.
Figura 7 ilustra el LCD lm016L utilizar.
La memoria CGROM es una memoria interna donde se
almacena una tabla con los caracteres que podemos visualizar
Los LCD que se utilizan con más frecuencia en el mercado hoy
en el lcd. La memoria CGRAM (Character Generator RAM):
en día son los LCD de 1 línea, 2 líneas o 4 líneas que tienen solo
en ella se pueden almacenar nuestros propios caracteres. [9]
1 controlador y admiten como máximo 80 caracteres, mientras
que los LCD que admiten más de 80 caracteres utilizan 2
controladores HD44780.
La mayoría de las pantallas LCD con 1 controlador tienen 14
pines y las pantallas LCD con 2 controladores tienen 16 pines
(dos pines son adicionales en ambos para las conexiones LED
de luz de fondo). La descripción del pin se muestra en la
siguiente tabla.
Tabla 2

Figura 8 ilustra los caracteres que se pueden visualizar, 192 caracteres.

Conversor Análogo Digital ADC

La conversión analógica-digital consiste en la transcripción de


señales analógicas en señal digital, con el propósito de facilitar
su procesamiento (codificación, compresión, etcétera) y hacer
la señal resultante (digital) más inmune al ruido y otras
La ROM del generador de caracteres genera patrones de
interferencias a las que son más sensibles las señales
caracteres de 5 x 8 puntos o 5 x 10 puntos a partir de códigos
analógicas. [10]
de caracteres de 8 bits. Puede generar 208 patrones de
Un convertidor análogo digital tiene como entrada un nivel de
caracteres de 5 x 8 puntos y 32 patrones de caracteres de 5 x 10
voltaje (valor analógico) y produce en su salida un número
puntos. Los patrones de caracteres definidos por el usuario
binario de n bits proporcional al nivel de la entrada (valor
6

digital). Los convertidores de señal análogo a digital abrevian


ADC o A/D.
Uno de los parámetros que definen al A/D es la resolución como
la mínima variación de voltaje en la entrada que produce
cambio del valor digital en la salida. La resolución del
conversor queda determinada por la cantidad de bits que
representan el resultado de la conversión.

𝑉𝑟𝑒𝑓+ − 𝑉𝑟𝑒𝑓−
𝑅𝑒𝑠𝑜𝑙𝑢𝑐𝑖𝑜𝑛 𝑣𝑜𝑙𝑡𝑎𝑗𝑒 𝐴𝐷𝐶 =
2𝑛 − 1

También se tiene que:

(2𝑛 − 1) ∙ 𝑉𝑖𝑛
𝑉𝑎𝑙𝑜𝑟 𝑑𝑖𝑔𝑖𝑡𝑎𝑙 = Figura 10 ilustra el detalle para la configuración de pines del registro
𝑉𝑟𝑒𝑓+ ADCON1.
Descripción
El registro ADCON1 configura las funciones de los pines de
El módulo convertidor Análogo Digital (A/D) del PIC 16F877 entrada al módulo. Como se aprecia en la figura anterior, se
tiene 8 canales de entrada. La conversión de la señal analógica puede configurar los pines del puerto A como entradas
aplicada (a uno de los canales) se plasma en número binario de analógicas inclusive la línea RA3 puede funcionar como el
10 dígitos. El módulo A/D posee voltajes de referencia que voltaje de referencia.
pueden ser seleccionados para emplear las tensiones VDD, VSS Los registros ADRESH: ADRESL contienen el resultado de la
del microcontrolador o puede emplear tensiones aplicadas a los conversión (10 bits). Cuando se ha completado una conversión
pines RA2 o RA3 (incluso es posible establecer combinaciones el resultado es almacenado en ADRESH: ADRESL y además
de los anteriores valores). el bit GO/-DONE (registro ADCON bit 2) se pone a 0-lógico y
el bit ADIF (registro PIR1 bit 7) se pone como 1-lógico. El
Para operar el módulo ADC contamos con 4 registros: registro PIR1 ocupa la posición 0x0C del banco 0.
• Registro de resultado de byte alto de la conversión A/D
(ADRESH). Banco 0, 0x1E. Diagrama de Bloques del módulo A/D
• Registro de resultado de byte bajo de la conversión A/D
(ADRESL). Banco 1, 0x9E.
• Registro 0 de control del módulo A/D (ADCON0).
Banco 0, 0x1F.
• Registro 1 de control del módulo A/D (ADCON1).
Banco 1, 0x9F.

El detalle del registro ADCON0 se muestra a continuación:

Figura 10 ilustra el diagrama de bloques del módulo A/D.


Figura 9 ilustra el detalle del registro ADCON0.
Después que el módulo A/D ha sido configurado, es necesario
esperar un periodo de tiempo para que la señal sea adquirida
(antes de las conversiones empiecen). Cada uno de los canales
de entrada tiene su correspondiente bit de configuración en los
registros TRIS y estos han de ser puestos como entradas.

Una vez que el periodo de adquisición ha terminado la


conversión A/D puede empezar. Los siguientes pasos muestran
7

la secuencia de uso:
1. Configure el módulo A/D: • 2Tosc
• Configurar los pines de entrada de los canales analógicos • 4Tosc
a usar. Configure los voltajes de referencia. (en el • 8Tosc
registro ADCON1) • 16Tosc
• Seleccione el canal de entrada al módulo A/D (en el • 32Tosc
registro ADCON0) • 64Tosc
• Seleccione el clock de conversión A/D (en el registro
ADCON0) Oscilador RC interno que tiene el módulo A/D (crea un retardo
• Ponga a funcionar el módulo A/D (en el registro de 2us a 6 us).
ADCON0) Para el correcto funcionamiento del módulo el clock de
1. Configure la interrupción del A/D si lo desea: conversión debe ser seleccionado para asegurar un TAD de
• ADIF=0 -lógico (bit que indica si se produjo una 1.6 𝑢𝑠 como mínimo.
conversión)
• ADIE=1-lógico (habilitador de interrupción del módulo Configuración de pines para forma analógica
analógico)
• PEIE=1 lógico (habilitador de interrupción de Los registros ADCON1 y TRIS controlan la operación de los
periféricos) pines de los canales A/D. Los pines que se empleen como
• GIE=1-lógico (Habilitador general de interrupciones) entradas deben ser configurados en los registros TRIS como 1-
lógico. Si en el registro TRIS se coloca a 0-lógico (como línea
1. Espere por el tiempo de adquisición (es el tiempo que se de salida) el módulo A/D convertirá el voltaje presente a la
demora en trabajar el bloque de sampling and hold). salida del pin. La operación de conversión del A/D es
independiente del estado de los bits CHS2:CHS0 y de los bits
2. Comienzo de la conversión de los registros TRIS.
• GO/-DONE=1-lógico (en el registro ADCON0)
Sobre la conversión análogo digital y el GO/-DONE
3. Esperar a que la conversión se complete. Para saber si la
conversión termino podemos: Si iniciamos una conversión y colocamos a 0-lógico el bit GO/-
• Revisar el bit GO/-DONE esperando que sea de nuevo 0 DONE conseguimos abortar la conversión A/D que se esté
-lógico. llevando a cabo en ese momento. El resultado de la conversión
• esperar al flag de ADIF sea 1-lógico (puede emplearse no aparecerá en los registros ADRESH: ADRESL y se
como interrupción). mantendrá el último valor convertido.
4. Leer el resultado del A/D en el par de registros (ADRESH: Después que la conversión A/D es abortada, la siguiente
ADRESL). No debemos olvidar colocar el bit ADIF a 0-lógico adquisición en el canal seleccionado empieza automáticamente.
(si se requiere) El bit GO/-DONE puede ser colocado a 1 para empezar la
5. Para la siguiente conversión, regrese al paso 1 o paso 2 conversión.
dependiendo si solo se usa uno o más canales.

Para el determinar el mínimo de tiempo de adquisición


requerido, usamos las expresiones:

Figura 12 ilustra los ciclos de conversión A/D.

Como se aprecia en la figura después que el bit GO es colocado


a 1-lógico comienza la conversión y al inicio hay que
Figura 11 ilustra las expresiones para la determinación del tiempo de desconectar el condensador lo cual demanda como máximo 1
adquisición. TAD, luego vienen los 10TAD correspondientes a los 10 bits
del A/D y se necesita un TAD más para depositar el resultado
Selección de Clock de conversión análogo digital en los registros ADRES, colocar el bit GO/-DONE de nuevo a
0-lógico y el bit ADIF a 1-lógico.
Otro parámetro importante el tiempo de conversión de A/D por
BIT (definida como TAD). La conversión A/D requiere un Almacenamiento de la conversión
mínimo de 12 TAD por 10 bits de conversión, La fuente para el
clock en la conversión A/D se selecciona por software. Hay 7 El par de registros ADRESH: ADRESL almacenan el resultado
posibles valores para la selección del TAD:
8

de la conversión A/D. Este par de registros ocupan 16 bits. EL dejando el primer configurado en cero, dejando el bit 3 variable,
módulo A/D tiene la flexibilidad de colocar el resultado ilustrado en la figura 15.
justificado a la derecha o a la izquierda de esos 16 bits
(formato). El bit que selecciona el formato es el ADFM
(registro ADCON1 bit 7).

Figura 15 ilustra el código para el bloque configuración.


Figura 13 ilustra la justificación A/D.
Finalmente, para este bloque, se llama a las configuraciones de
LCD y teclado mediante el llamado mostrado en la figura 16.
III. DESARROLLO EXPERIMENTAL
Se presentan una serie de desafíos de programación en
assembler (ensamblador), se solicita desarrollar distintas Figura 16 ilustra el código para la configuración de LCD y teclado.
aplicaciones utilizando una interfaz hombre-maquina (HMI)
implementándolo en el PIC16F877a. Para que el ultimo valor se almacene en la EEPROM y sea
leído, ambas salidas se almacenarán en la dirección 0x00 de la
EEPROM mediante el registro EEADR, ilustrado en la figura
17.

Figura 17 ilustra parte del código para el almacenamiento en la dirección cero


de la EPROM.

Luego se muestra en la pantalla mediante un llamado a la tabla


Figura.14 ilustra el PIC16F877a con la configuración de elementos para la
experiencia 1. de LCD y a la librería LCD_4bits, después de mostrar el
mensaje de bienvenida al inicio del programa y de realizar una
Experiencia N°1 conversión de datos binarios a decimal y terminando con un
llamado a un retardo de 5 segundos, realizando un llamado a la
Para la experiencia N°1, usando el diagrama de la figura 14, se librería Retardo, código ilustrado en la figura 18.
debe mostrar la última lectura de la señal analógica escalda,
almacenada en la EPROM, durante 5[s]. Mediante la interfaz
HMI, se debe poder seleccionar la lectura de una de las señales
analógicas de entrada; también, mediante el teclado, se debe
poder ingresar un valor mínimo de escalamiento, entre 0 y 9 y
luego presionar la tecla ENTER (letra E), igualmente, se debe
poder digitar un valor máximo de escalamiento, entre 0 y 9 y
presionar la tecla ENTER (letra E)

Para ello, primero se crea un bloque configuración, en el cual


se habilita la entrada analógica, accediendo al banco de
memoria 0 mediante bsf STATUS, RP0 y moviendo un literal
0x00 al registro ADCON1, luego, fuera del banco de memoria
0, se configuran para todos los bits del ADCON de la siguiente
manera:
El bit 7 se deja en cero, mediante bcf ADCON0,7, así se
justifica a la izquierda, el bit 6 se configuró en 1 mediante bsf
ADCON0,6.
El canal CH se configura en 000 para AN0 y 001 para AN,
debido a que se usaran dos conversores análogo-digitales, Figura 18 ilustra el código para leer los datos almacenados en la EEPROM.
9

Para seleccionar la señal analógica de entrada, se trabaja con un


menú ocupado en experiencias y evaluaciones anteriores, la
máscara permite discernir mediante comparadores si el valor
ingresado corresponde a los disponibles en el menú de selección
de señal a tratar; cuando se ejecuta la simulación, llama a la
subrutina “bienvenido” perteneciente a la librería mensajes -
ilustrado en la figura19-, la cual contiene los caracteres del
mensaje, los que se mostraran en pantalla.

Figura 21 ilustra el código de la librería Menú con el mensaje de la selección


de señales.

Al seleccionar una de las opciones, por ejemplo, la opción 1,


salta a la subrutina “convADC_portAN0”, en la cual
inmediatamente llama a la subrutina “Digitos1”, perteneciente
a la librería “Mensajes”, esta subrutina contiene los caracteres
para “LIMITE INFERIOR”, ilustrado en la figura 22, mensaje
que se muestra en el LCD.

Figura 19 ilustra la librería Mensajes, con el mensaje de bienvenida.

Luego como se comentó anteriormente, lee los valores


almacenados en la EEPROM, leyendo cada valor binario,
transformándolo a decimal y llamando a la subrutina
LCD_CARCATER para mostrar en display el valor leído, luego
llama a retardo de 2 segundos y finalmente entra al bucle de Figura 22 ilustra la librería Mensajes, con los caracteres para “1. LIMITE
“menu1” a la espera de instrucciones -figura 20-. INFERIOR”.

Al digitar el limite inferior, este se almacena en “NUMLIM1”,


se le suma 0x30 y este resultado de suma, se almacena en el
acumulador, llamando a LCD_CARACTER para visualizar el
valor ingresado en el LCD. Posteriormente, al valor de limite
Figura 20 ilustra el código para el bucle menu1. almacenado en “NUMLIM1” se amplifica por 10, llamando a
las subrutinas de operaciones y se almacena en “LIMINF” para
En este bucle, se llamó a la subrutina “menu2, la cual pertenece su uso en el escalamiento, esta parte del código se ilustra en la
a la librería “Menú”, donde se encuentra el menú de selección figura 23.
de señal a tratar, carácter por carácter, “SELECCIÓN” 1.
SENAL AN0”, “2. SENAL AN1, la máscara se muestra en la
figura 21.
10

En la subrutina “Escalado”, el valor almacenado en AUX se


procesa siguiendo:

255
𝐹𝐴𝐶𝑇𝑂𝑅 =
𝐴𝐷𝐶
𝐷𝐿𝐼𝑀
𝐸𝑆𝐶𝐴𝐿𝐴𝐷𝑂 =
𝐹𝐴𝐶𝑇𝑂𝑅

Donde el 255 corresponde al valor máximo de la resolución,


ADC es la señal que se detecta por AN0 o AN1. La
programación permite almacenar la ADC como divisor y la
resolución en el numerador; al pasar a las rutinas de
multiplicación, ésta arroja el resultado en parte alta y parte baja
del número (Result_H, Result_L), se les multiplica 0x01 y se
Figura 23 ilustra el código para la subrutina “Ingreso_limini”. pasa a (Dividendo_H, Dividendo_L).
Finaliza con el llamado a la subrutina “PRES_ENT” la cual
permite, mediante comparadores, revisar si efectivamente se
presionó la letra E, cerrar esa rutina y entrar a la de ingreso de
limite superior, siendo esta, análoga a la primera.
Luego de digitar y almacenar los limites superior e inferior
(LIMSUP, LIMINF), estos se almacenan en “DLIM”, para
luego, volver a llamar a “PRES_ENT” -figura 24-.

Figura 24 ilustra el código para la subrutina “Ingreso_limax2”. Figura 26 ilustra el código para la subrutina “Escalado”.

Luego de esto, salta a la subrutina “lectura01” y el programa Luego pasa a la rutina “escalado”, pasa a la rutina “comp2”
espera que se realice la lectura del conversor análogo digital, donde se enmascara lo guardado en acumulador y se resta con
donde el valor ingresado se almacena en la variable AUX y pasa lo almacenado en “Divisor”, después, mediante “btfss” se toma
a la subrutina “Escalado”, el código se ilustra en la figura 25. una decisión lógica revisando el bit de carry, si este es 1, se salta
a la rutina “mitad”, en caso contrario, salta a “rutinabajo2”,
ilustrado en la figura 27.

Figura 27 ilustra el código para la subrutina “comp2”.

En “rutinabajo2” -figura 28-, se mueve el valor almacenado en


“Cociente_L” al acumulador y se suma con lo almacenado en
“Cociente_H” mediante addwf, y se guarda en “Factor_B”,
Figura 25 ilustra el código para la subrutina “espera”. luego se enmascara este valor con 0x0A, se guarda en
“Factor_A” y se llama la subrutina “multiplicar”, perteneciente
11

a la librería “MULTDIV”, se suman los valores del resultado memoria uno, mediante bsf STATUS, RP1, luego se mueve la
alto y bajo, se mueven a “AUXINT”, se mueve el valor de dirección 0x00 al acumulador y del acumulador al registro
“Dividendo_L” al acumulador y del acumulador se mueve a EEADR, para luego salir del banco 1.
“Factor_B”. Se mueve el valor de “NUM1” al acumulador, se llama a la
Este valor, almacenado en “Factor_B”, se enmascara por 0x0A subrutina “EEPROM_EscribeDato” perteneciente a la librería
y se mueve a “Factor_A” al acumulador, luego, usando “EEPROM”, luego se realiza una conversión binario-BCD para
nuevamente las operaciones de para multiplicar y dividir, se la “decena” y para la “unidad”, llamando en cada caso a la tabla
operan lo almacenado en acumulador, arrojando un valor bajo de caracteres “TablaLCD” y a la subrutina
“Result_H” y uno alto “Result_H” los cuales se dividen, “LCD_CARACTER” para mostrar proyectar los valores en la
almacenándose otra vez en “Divisor”; posteriormente se mueve pantalla LCD, esta sección del código ilustrada en la figura 30.
el valor de “DLIM” al acumulador y del acumulador, a
“Factor_B” donde se repite el procedimiento, enmascarando y
usando las operaciones de multiplicación y división, para,
finalmente sumar los valores altos y bajos de la división.

Figura 28 ilustra el código para la subrutina “rutinabajo2”.


Figura 30 ilustra el código para la subrutina “salida”.
Para la rutina “mitad”, figura 29, se opera con el resultado de
“DLIM” que alberga al delta de los limites ingresados, el cual Finalmente salta a la subrutina “lectura01” donde se llama a la
se mueve al acumulador y del acumulador al “Factor_B”, subrutina “valores”, perteneciente a la librería “Mensajes”, el
enmascarándose con 0x0A y guardándose en “Factor_A”, cual contiene los caracteres para el mensaje “1. VALOR
luego, siguiendo el procedimiento anterior, se llama a la MEDIDO”, figura 31.
subrutina multiplicar, arrojando los resultados altos y bajos;
posteriormente se guardan en los dividendos L y H y se llama a
la subrutina “Dividir” para luego finalmente sumar los
resultados altos y bajos de la división.

Figura 29 ilustra el código para la subrutina “mitad”.

En la rutina “salida”, se opera con el valor ingresado en la


interfaz, “LIMIN”, sumándose al acumulador, moviéndose a la
variable “NUM1”; esta rutina es necesaria para escribir el dato
Figura 31 ilustra los caracteres de la subrutina “valores”.
en a memoria EEPROM, para ello, se accede al banco de
12

Se limpian la variable AUX mediante clrf y el bit 3 del registro Utilizando el diagrama de la figura 33, se debe implementar un
ADCON0, mediante bcf, después de llamar a la subrutina bus de control de cuatro líneas utilizando pulsadores, los cuales
“Retardo_20micros”, perteneciente a la librería “Retardos”, definirán el comportamiento de las ocho salidas digitales
mediante bsf se ubica un uno en el bit dos del registro implementadas en el PORTD, según la tabla 3.
ADCON0, para luego pasar a la subrutina “espera”, como se
puede ver en la figura 32. Tabla 3

El sistema deberá reaccionar en forma inmediata al presionar


cualquier pulsador del bus de control (interrupción de cambio
de estado del PORTB).
El INTERRUPTOR (LOGIC STATE) P0 conectado a la
interrupción externa deberá realizar lo siguiente, al detectar:

Flanco Ascendente: Cambiar la temporización de la rotación


en la salida: (si es 1 [s] cambiar a 2 [s], y si la temporización
actual es 2 [s] cambiar a 1 [s]).

Flanco Descendente: Cambiar la cantidad de BITS de rotación


en la salida: (si es 1 BIT cambiar a 2 BITS, y si la cantidad de
bits actual es 2 BITS cambiar a 1 BIT)

Además, los tiempos de rotación se deben realizar


exclusivamente utilizando la interrupción del Timer disponible
Figura 32 ilustra el código para la subrutina “lectura01”.
en el microcontrolador.
En la subrutina “espera”, se toma una decisión lógica mediante
Para que el sistema reaccione de forma inmediata al presionar
btfsc revisando el bit 2 del registro ADCON0, si es cero, sigue
cualquier pulsador del bus de control y cumpla los requisitos de
con la rutina, moviendo el valor alto almacenado en
la tabla 1; se inicia en el cuerpo principal de programación,
“ADRESH” al acumulador, luego se mueve del acumulador a
accediendo al banco cero de memoria mediante bsf
la variable AUX, para luego enmascararse por 0x01, luego,
STATUS,RP0, luego la rutina “principal”, en la cual se limpia
mediante subwf se restan el AUX y el acumulador y se vuelve
el puerto C mediante clrf TRISD, definiéndolo como salida, se
a tomar una decisión lógica mediante btfss, revisando el bit de
vuelve del banco cero y se limpia el puerto de salida D mediante
carry, si este es uno, salta a la subrutina “factor”, si no, pasa a
clrf PORTD, luego se dan los permisos particulares y generales
la subrutina “cero”.
para la interrupción RB mediante bsf INTCON,RBIE y bsf
La primera decisión lógica de este bloque permite seguir con
INTCON,GIE, inmediatamente se limpia el flag RBIF, como se
los pasos anteriores, en caso contrario, se mantiene en un bucle,
muestra en la figura 34.
dando vueltas en “espera”.
La rutina termina con un salto a la bandera “Escalado”, el
procedimiento es análogo para la captación de dígitos en la
selección de menu e ingreso y procesamiento de limites para la
segunda entrada.

Experiencia N°2

Figura 34 ilustra el código para la rutina “principal”.

Luego, en ORG 4 se cargan las interrupciones, llamándose a la


etiqueta de cambio de estado del puerto B, “nibblePB”, como
se muestra en la figura 35.

Figura.33 ilustra el PIC16F877a con la configuración de elementos para la


experiencia 2.
13

Figura 35 ilustra el código para la interrupción.

La subrutina “nibblePB” se desarrolla de la siguiente manera, Figura 38 ilustra el código para la subrutina “et2”.
se configura un selector de acción que discrimine entre
pulsadores de acuerdo con el valor hexadecimal formado con La última restricción es la interrupción, en cada condición de la
ellos. tabla 1, la cual se debe realizar exclusivamente con la
interrupción del timer, para ello, se ocupó el timer 0, agregando
Primero se habilita la interrupción por cambio de estados del líneas de programación a la rutina “principal”, donde el timer 0
puerto B, mediante un llamamiento de escritura lectura de este se configuró de la siguiente manera:
puerto mediante movf PORTB,0 , aprovechando que para
despertar al micro se realiza una lectura del puerto B al pasar la De acuerdo con el datasheet del micro 16F877A, en
información de este al acumulador se puede detectar la OPTION_REG, en el bit 7 correspondiente a RBPU el cual
pulsación, luego mediante andlw 0xF0, se enmascara para corresponde a las resistencias push up del PORTB, las que no
quitar todo lo no necesario del nibble, se almacena el dato en se ocupan, por lo que se ponen en 1, el INTEDG se configuro
una variable AUX y se compara mediante btfss, si el pulsador en flanco de subida, dejándolo en 1, el T0SE no se ocupará, el
detecta un 0x10, salta a la rutina “bit4PB”, la cual permite rotar PSA se habilita para asignar un preescalador, para este caso se
un bit a la derecha del PORTD, ilustrado en la figura 36. eligió el 256 correspondiente a 111, por lo que P2S, PS1 y PS0
quedan en 1, como se observa en la figura 39.

Figura 36 ilustra el código para la subrutina “nibblePB”.

Al finalizar la rutina “bit4PB”, se limpia el flag mediante bcf


INTCON, RBIF, sale de la interrupción y vuelve a la rutina
“bit4PB”, desde e lugar de donde salió; si no detecta el 0x10 o
un numero mayor, salta a la bandera “et1” donde se compara
con 0x20; si se cumple, realiza la misma rutina anterior, para Figura 39 ilustra el código para la subrutina “principal”.
cumplir la segunda condición que es rotar a la izquierda un bit
del PORTD con 1 segundo de temporización, como se muestra Con el TMR0configurado, se calcula el retardo, para 50[ms],
en la figura 37. para una frecuencia de 4[MHz], con el prescaler de 256; el valor
de TMR0responde a la siguiente expresión:

𝑡∙𝑓
𝑇𝑀𝑅0 = 𝑝𝑟𝑒𝑠𝑐𝑎𝑙𝑒𝑟 −
4 ∙ 𝑝𝑟𝑒𝑠𝑐𝑎𝑙𝑒𝑟

Reemplazando los valores se obtiene:


Figura 37 ilustra el código para la subrutina “et1”.
𝑇𝑀𝑅0 = 60.68 ≈ 61 = 3𝐷ℎ
En caso contrario, salta a la bandera “et2”, donde se compara
Por lo que los valores de TMR0 estarán entre:
con el 0x40 ya que, si es mayor, se cumple la última condición,
luego de esto salta a las interrupciones, ilustrado en la figura 38.
0 ≥ 𝑇𝑀𝑅0 ≥ 255

Se realiza una rutina para 50[ms], llamada “Retardo50ms”, en


la cual, primero se limpia el flag de TMR0 mediante bcf
INTCON, TMR0IF, luego se carga el 61 (3Dh) en el TMR0 y
se hace un loop de comprobación, hasta que se desborda e flag
14

del TMR0, si se desborda, el timer alcanzó el valor de 3Dh, sumas y la división por medio de un buble de restas, para poder
ilustrado en la figura 40. visualizar decimales, lo que se debe realizar es multiplicar el
resto de la división y volverlo a dividir y almacenar estos datos
en variables independientes que luego se llaman a pantalla, pero
como ya se menciono para la multiplicación se debe respetar la
restricción de que el resultado no exceda los 8 bits para que no
produzca desbordamientos de memoria o comportamientos
erráticos en el micro, esto trae un problema y es que si uno
compara el escalamiento realizado versus un amperímetro
conectado al potenciómetro hay diferencia en los valores
Figura 40 ilustra el código para la subrutina “Retardo50ms” y “comprobar”. mostrados, ya que el escalado por las limitaciones realiza
aproximaciones que muestran en pantalla una lectura con un
Para el retardo de 1[s] se hace una rutina a parte, la que cierto error versus la lectura real, por lo cual es un punto de
configura un bucle que da 20 vueltas. mejora que se debe realizar para futuras versiones del software
que manipula el microprocesador.
Se realizaron cambios en la rutina “principal”, comentando la
línea del binario que configuraba “OPTION_REG”, por una
Experimento 2, esta parte del trabajo es la que más dificultad
configuración pin a pin, eliminando el bit 6 que configuraba el
presento, ya que hay que realizar interrupciones de forma
flanco ascendente-descendente, ilustrado en la figura 41.
simultanea o paralela al código principal, donde la línea
principal en este caso se utiliza más que nada para realizar la
configuración de lo necesario para trabajar con el micro y
habilitar las interrupciones, en este caso se trabaja con tres tipos
de interrupciones, el primer tipo de interrupción es el cambio
de estado del puerto B que gobierna el bus de control, aquí nos
aprovechamos de una propiedad de este tipo de interrupción y
es que para que reaccione el micro, se debe realizar una lectura
o escritura del puerto B, esto es por cómo están dispuestas las
compuertas lógicas dentro del micro, por lo que se realiza la
lectura y se utilizan las instrucciones btfss y btfsc para
discriminar que valores son los que se están enviando por el
puerto B por medio de los logic toggle, y así poder realizar las
distintas acciones solicitadas para este bus, como este bus tiene
que tener retardos, pero no realizados por la librería entregada
en clases, se hacen retardos por medio del timer cero,
aprovechando que por medio de su desbordamiento se pueden
realizar temporizaciones, para ello se va a utilizar otra
Figura 41 ilustra el código para la subrutina “principal”.
propiedad del micro que es poder preescalar el reloj de la cpu,
por lo cual en este trabajo se utilizará un preescaler de 256 para
Con esta modificación, para asegurar que el timer funcione en
flanco de subida y de bajada, cuando se habilita la interrupción, poder llegar a un tiempo de 50 milisegundos solo por
se enciende la opción de reacción de subida o bajada. desbordamiento del TMR0, luego este tiempo se pasa por un
buble multiplicador de 20 para que de 1 segundo, con esto se
II.A. Análisis Teórico logran todos los tiempos solicitados, también para el segundo
bus de control que es por un logic state, en el flanco descendente
Experimento 1, se debe realizar la lectura de señales la interrupción externa haga una acción y con el flanco
analógicas y mostrar esta lectura con el escalamiento definido ascendente otra acción, también se realiza lectura del puerto B
por el usuario en la pantalla, para ellos se debe ingresar por para poder discriminar lo que pasa en el otro nibble del puerto
medio del teclado un límite mínimo y máximo restringido a un B como en este caso solo varia un bit, los demás se mandan a
digito, por lo cual el escalamiento realizado debe mostrar un tierra para asegurar que esos valores sean cero, el tema del
decimal para mejorar la resolución de la lectura de la señal de tiempo se controla por medio de la lectura del flag de la
entrada, lo más complejo en base a lo relatado anteriormente es interrupción externa realizando saltos de línea para lograr la
el escalado que se debe realizar, ya que el microprocesador debe temporización de 1 segundo y para contar los 2 segundos no se
realizar multiplicaciones, divisiones, sumas y restas para lograr realiza el salto, ahora la otra acción que se pide se realiza por
este cometido, el problema es que el microprocesador está medio de un salto dentro del código para mostrar un bit o dos
limitado a números de 8 bits (0 a 255 en decimal) y además no bit rotando por el puerto D.
reconoce decimales, para la multiplicación y división se hace la
inclusión de la librería correspondiente a estas operaciones,
donde la multiplicación se realiza por medio de un bucle de
15

II.B. Simulación de Modelos


Flanco ascendente, y descendente 1 bit.
Luego de compilar el código ensamblador usando el software
MPLAB, y su implementación en el software de simulación
Proteus, se obtiene lo siguiente:

Simulación Experiencia 1

Selección de señal AN0 y escalamiento.

Figura.45 Video de la simulación de la experiencia 2, versión online.

Flanco descendente 2 bit.

Figura.42 Simulación del circuito para la experiencia 1, versión online.

Selección de señal AN1 y escalamiento.

Figura.46 Video de la simulación de la experiencia 2, versión online.

III. Análisis de Resultados

Simulación experiencia 1: En esta simulación se observó en


los videos de las figuras 42 y 43, que al ejecutar, efectivamente
se muestra el mensaje de bienvenida, luego durante 5[s] se
Figura.43 Simulación del circuito para la experiencia 1, versión online. muestra la última señal analógica medida, luego de 5[s] en el
LCD se muestra bel mensaje de selección (menú) para
Simulación Experiencia 2 seleccionar la señal AN0 o AN1, posteriormente, se muestra un
nuevo mensaje que pide ingresar el límite inferior y superior,
Resultado inmediato en PORTD. pidiendo a la vez presionar la tecla E para ENTER, finalmente
luego del ingreso del límite superior, se muestra correctamente
el mensaje “valor medido: xx “, valor que varía si se interactúa
con el potenciómetro RV1 u RV2, dependiendo de la señal
seleccionada.
Si se vuelve a simular, se visualiza en el LCD la última
medición de señal guardada en la EEPROM, durante 5[s].

Simulación 2: Para esta simulación, se observó que:

Para el video de la figura 44, al ejecutar y seleccionar P1,


efectivamente se cumple la rotación de bits a la derecha
mostrando el cambio lógico en cada pin del puerto D, con una
temporización de 1[s], al terminar el viaje del bit de derecha a
Figura.44 Simulación del circuito para la experiencia 2, versión online. izquierda, al presionar el P2, la dirección de rotación cambia
16

hacia la izquierda hasta llegar al otro extremo, con la misma en este curso.
temporización. Las interrupciones constituyen el mecanismo más importante
Al seleccionar P3, se produce un cambio efectivo en la rotación para la conexión del microcontrolador con el exterior ya que
del bit, en este caso de dos bits, hacia la derecha, viajando hacia sincroniza la ejecución de programas con los acontecimientos
el otro extremo con una temporización de 2[s]; al presionar el externos. Esto es muy útil, por ejemplo, para el manejo de
P4, los dos bits cambian de dirección de viaje, hacia la dispositivos de entrada que requieren de una atención
izquierda, con el mismo temporizador, de esta manera se inmediata, tales como detección de pulsos externos, recepción
comprobó la respuesta inmediata dados los requerimientos de de datos, activación de pulsadores entre otros.
la tabla 1.
Para el video de la figura 45, al ejecutar y presionar el P1, se ve
el bit en movimiento hacia la derecha con temporización de V. REFERENCIAS
1[s], inmediatamente, al presionar el P0, cambia la
temporización, pasando de 1[s] a 2[s] (flanco ascendente).
[1] H. U. Villamil Gonzales, «Modulo de
Al volver a presionar P0 (flanco descendiente), el bit unitario,
Microcontroladores & Microprocesadores,» Programa
cambia a 2 bits, moviéndose en la misma dirección, con una de Ingenieria Electronica, p. 9, 2009.
temporización de 1[s].
[2] E. f. L. Palacios Remiro Lopez, Microcontrolador
Para el video de la figura 46, se observó que, al ejecutar, se
PIC16F84 Desarrollo de proyectos, Mexico DF:
presionó P3, lo que efectivamente genera un doble bit,
Alfaomega, 2004.
moviéndose hacia la derecha con una temporización de 1[s];
luego al presionar P0 (flanco descendente), el bit doble cambio [3] C. H. Coutiño Ruiz, «MV Electrónica,» 2018. [En
a un solo bit, aumentando su temporización de 1 a 2[s] línea]. Available:
https://mvelectronica.com/products/PIC16F877A.
[Último acceso: 10 05 2021].
IV. CONCLUSIONES
[4] M. Delgado, «https://www.blogger.com/,» 26 06 2014.
En primera instancia se puede decir que los
[En línea]. Available:
microprocesadores son herramientas poderosas que con un set https://mikitronic.blogspot.com/2014/06/el-
limitado de instrucciones permiten realizar operaciones microcontrolador-consta-de-un.html. [Último acceso: 10
complejas, como retardos, controlar botoneras o pantallas y 05 2021].
realizar operaciones aritméticas. Las interrupciones PIC son
[5] D. Salvatierra Figueroa, Microcontroladores
desviaciones de flujo de control del programa originadas
PIC16F877A y PIC16F887, C.V., México: Alfaomega,
asincrónicamente por diversos sucesos que no dependen del 2012.
programador; ocurren en cualquier momento.
[6] A. Martín Pernía, «https://www.unioviedo.es/,» 04 12
2002. [En línea]. Available:
Las interrupciones PIC ocurren por sucesos externos como la
https://www.unioviedo.es/ate/alberto/TEMA2-
generación de una interrupción por flanco PIC, una interrupción
Memoria.pdf. [Último acceso: 10 05 2021].
externa PIC cambiando el nivel en un PIN del microcontrolador
o eventos internos tales como el desbordamiento de un [7] Fundacion Descubre; , Andalucía, «fundaciondescubre,»
contador, terminación del conversor análogo a digital, entre [En línea]. Available:
https://clickmica.fundaciondescubre.es/conoce/descubri
otras.
mientos/pantallas-lcd/. [Último acceso: 15 05 2021].
El primer experimento permite mostrar que los micros se [8] Embeddedcenter, «Embeddedcenter Innovation of
pueden configurar de forma efectiva, dado requerimientos Engineers,» 2013. [En línea]. Available:
específicos, en este caso, para captar una señal analógica y https://embeddedcenter.wordpress.com/ece-study-
centre/display-module/lcd-16x2-lm016l/. [Último
mediante características propias del micro, capturar esa señal
acceso: 15 05 2021].
analógica y transformarla a una versión digital de la misma,
pudiendo elegir entre la captación de una señal u otra, [9] TodoElectrodo, «http://todoelectrodo.blogspot.com/,»
visualizando el resultado casi en tiempo real, lo que tiene 10 02 2013. [En línea]. Available:
múltiples usos, como la implementación de un termómetro http://todoelectrodo.blogspot.com/2013/02/lcd-
16x2.html. [Último acceso: 15 05 2021].
mediante un sensor conectado ala entrada análoga, y su
posterior conversión y visualización de dicha temperatura en la
pantalla LCD.

El segundo experimento aumenta la complejidad ya que se pide


emplear las interrupciones para controlar el funcionamiento del
micro, en este caso, del comportamiento de PORTD, con el
objetivo de variar el estado lógico de sus pines y del tiempo
entre estas variaciones, logrando así influir en el proceder del
micro de una forma análoga a las otras formas antes estudiadas
17

ANEXO
Diagramas de Flujo

A. Diagrama 1

Diagrama Experiencia N°1.xlsx

B. Diagrama 2

Diagrama Experiencia N°2.xlsx

También podría gustarte