Documentos de Académico
Documentos de Profesional
Documentos de Cultura
ADC, EEPROM,
INTERRUPCIONES PIC 16F877a
Experiencia de Laboratorio N°3
MICROPROCESADOES
(Julio de 2021)
José Miguel Aramburú Hernández, Ismael Roberto Acevedo Pavez
Características del PIC16F877a Figura 1 ilustra las formas en las que puede venir empaquetado el
PIC16F877a.
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
Puertos y Periféricos
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
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
DDRAM y CGROM
𝑉𝑟𝑒𝑓+ − 𝑉𝑟𝑒𝑓−
𝑅𝑒𝑠𝑜𝑙𝑢𝑐𝑖𝑜𝑛 𝑣𝑜𝑙𝑡𝑎𝑗𝑒 𝐴𝐷𝐶 =
2𝑛 − 1
(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.
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.
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).
255
𝐹𝐴𝐶𝑇𝑂𝑅 =
𝐴𝐷𝐶
𝐷𝐿𝐼𝑀
𝐸𝑆𝐶𝐴𝐿𝐴𝐷𝑂 =
𝐹𝐴𝐶𝑇𝑂𝑅
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.
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.
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
Experiencia N°2
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.
𝑡∙𝑓
𝑇𝑀𝑅0 = 𝑝𝑟𝑒𝑠𝑐𝑎𝑙𝑒𝑟 −
4 ∙ 𝑝𝑟𝑒𝑠𝑐𝑎𝑙𝑒𝑟
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
Simulación Experiencia 1
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.
ANEXO
Diagramas de Flujo
A. Diagrama 1
B. Diagrama 2