Descargar como docx, pdf o txt
Descargar como docx, pdf o txt
Está en la página 1de 16

0

Instituto Tecnológico de Durango

Corrimiento de LED´s 2.
PRÁCTICA 3

Carrera: Ingeniería Mecatrónica


Materia: Microcontroladores
Alumno: Jurado Nevarez Efren David
Número de control: 15041076
Profesor: Esparza Ávila Miguel Ángel
Fecha de entrega: 04/03/2019
1

Índice

Objetivo 2
Temas relacionados 2
1 Marco teórico 2
1.1 Interrupciones 2
1.2 Timer0 del PIC 16F887 3
1.3 Registro OPTION_REG 5
1.4 Registro INTCON 6
Desarrollo 8
Material y/o equipo utilizado 15
Conclusiones 15
Fuentes de información 15
2

Objetivo
Utilizar adecuadamente puertos, módulos de timer e interrupciones en lenguaje
ensamblador, en el desarrollo de la aplicación “Corrimiento de LED´s”.
Mediante la configuración del TMR0, lograr un retardo de 0.5segundos, y además mantener
otra variable de control para encender/apagar leds en secuencia.

Temas relacionados
 Funcionamiento del registro OPTION_REG
 Funcionamiento del registro INTCON
 Funcionamiento de las interrupciones, así como del timer0
1 Marco teórico
1.1 Interrupciones
Una interrupción es un evento que hace que el microcontrolador deje de ejecutar la tarea
que está realizando para atender dicho acontecimiento y luego regrese y continúe la tarea
que estaba realizando antes de que se presentara la interrupción.
Cada modelo de microcontrolador PIC tendrá una serie de interrupciones que podrá
detectar, para que se detecten las interrupciones con el PIC, es necesario programar algunos
registros dependiendo de cuál se quiere que sea la causa de las interrupciones, se tienen
registros para habilitar las interrupciones con el PIC y registros para detectar cuando se han
producido interrupciones.
El PIC16F882 / 883/884/886/887 tiene múltiples fuentes de interrupción:
 Interrupción externa RB0 / INT
 Interrupción de desbordamiento del temporizador0
 Interrupciones de cambio de PORTB
 Interrupciones del comparador
 Interrupción A / D
 Interrupción de desbordamiento del temporizador1
 Interrupción de coincidencia del temporizador2
 Escritura de datos EEPROM Interrupción
 Monitor de reloj a prueba de fallas Interrupción
 Interrupción de CCP mejorada
 Interrupciones de recepción y transmisión EUSART
 Interrupción de activación de energía ultra baja
 Interrupción MSSP
El registro de control de interrupción (INTCON) y el Registro de solicitud de interrupción
periférica (PIR1) registra solicitudes de interrupción individuales en bits de bandera.
3

Al aparecer una petición de interrupción lo primero que hace el microcontrolador es


ejecutar la instrucción actual después de que se detiene el proceso de ejecución de
programa. Como resultado, la dirección de memoria de programa actual se apila
automáticamente y la dirección por defecto (predefinida por el fabricante) se escribe en el
contador de programa. La localidad en la que el programa continúa con la ejecución se le
denomina vector de interrupción. En el caso del microcontrolador PIC16F887 esta
dirección es 0x0004h. Como se muestra en la figura 5, la localidad que contiene el vector
de interrupción se omite durante la ejecución de programa regular. Una parte de programa
que se ejecutará al hacer una petición de interrupción se le denomina rutina de interrupción.
Su primera instrucción se encuentra en el vector de interrupción. Cuánto tiempo tardará en
ejecutar esta subrutina y cómo será depende de la destreza del programador, así como de la
fuente de interrupción. Algunos microcontroladores tienen más de un vector de interrupción
(cada petición de interrupción tiene su vector), pero en este caso sólo hay uno. En
consecuencia, la primera parte da la rutina de interrupción consiste en detectar la fuente de
interrupción. Por fin, al reconocer la fuente de interrupción y al terminar de ejecutar la
rutina de interrupción el microcontrolador alcanza la instrucción RETFIE, toma la dirección
de la pila y continúa con la ejecución de programa desde donde se interrumpió.

Figura 1.0 Diagrama que representa la atención de una interrupción en un microcontrolador


16F84/F628/F88.

1.2 Timer 0 del PIC16F887


El módulo Timer0 es un contador / temporizador de 8 bits con las siguientes características:
 registro de contador / contador de 8 bits (TMR0)
 preescalador de 8 bits (compartido con el temporizador de vigilancia)
 Fuente de reloj programable interna o externa
 Borde de reloj externo programable selección
 Interrumpir en el desbordamiento
4

Figura 1.1 Diagrama de bloques del módulo Timer0.


Cuando se usa como un temporizador, el módulo Timer0 puede usarse como un
temporizador de 8 bits o como un contador de 8 bits.
Cuando se usa como temporizador, el módulo Timer0 incrementará cada ciclo de
instrucción (sin precalificador). El modo de temporizador se selecciona borrando el bit
T0CS del registro OPTION a ‘0’. Cuando se escribe TMR0, el incremento se inhibe
durante dos ciclos de instrucción inmediatamente después de la escritura.
Cuando se usa como contador, el módulo Timer0 se incrementará en cada borde ascendente
o descendente del pin T0CKI. El borde de incremento está determinado por el bit T0SE del
registro de OPCIÓN. El modo de contador se selecciona configurando el bit T0CS del
registro OPCIONAL en "1".
Hay disponible un preescalador programable con un solo software para usarlo con Timer0 o
Watchdog Timer (WDT), pero no con ambos simultáneamente. La asignación del prescaler
está controlada por el bit PSA del registro OPTION. Para asignar el prescaler a Timer0, el
bit de PSA se debe borrar a un '0'. Hay 8 opciones de preescalador para el módulo Timer0
que van desde 1: 2 a 1: 256. Los valores de preescala se pueden seleccionar a través de los
bits PS <2: 0> del registro OPCIÓN. Para tener un valor de preescalador 1: 1 para el
módulo Timer0, el prescaler debe asignarse al módulo WDT. El preescalador no se puede
leer ni escribir. Cuando se asigna al módulo Timer0, todas las instrucciones que se escriban
en el registro TMR0 borrarán el prescaler. Cuando el prescaler se asigna a WDT, una
instrucción CLRWDT borrará el prescaler junto con el WDT.
5

1.3 Registro OPTION_REG


El registro OPTION_REG contiene varios bits de control para configurar el pre - escalador
del Temporizador 0/WDT, el temporizador Timer0, la interrupción externa y las
resistencias pull-up en el puerto PORTB.

Figura 1.2 Bits del registro OPTION_REG


RBPU - Port B Pull up Enable bit (resistencia Pull Up Puerto B)
 1 - Desactivadas.
 0 - Activadas.
INTEDG - Interrupt Edge Select bit (bit selector de flanco activo de la interrupción externa)
 1 - Interrupción por flanco ascendente en el RB0/INT.
 0 - Interrupción por flanco descendente en el RB0/INT.
T0CS - TMR0 Clock Source Select bit (bit selector de tipo de reloj para el Timer0)
 1 - Pulsos introducidos a través del TOCKI (contador).
 0 - Pulsos de reloj internos Fosc/4 (temporizador).
T0SE - TMR0 Source Edge Select bit (bit selector de tipo de flanco en TOCKI) selecciona
el flanco (ascendente o descendente) contado por el temporizador Timer0 por el pin
RA4/T0CKI.
 1 - Incrementa en flanco descendente en el pin TOCKI.
 0 - Incrementa en flanco ascendente en el pinTOCKI.
PSA - Prescaler Assignment bit asigna el pre-escalador (hay sólo uno) al temporizador o al
WDT.
 1 - Pre - escalador se le asigna al WDT.
 0 - Pre - escalador se le asigna al temporizador Timer0.
6

PS2, PS1, PS0 Prescaler Rate Select bits (bit selector del valor del divisor de frecuencia)
PS2 PS1 PS0 TMR0 WDT
0 0 0 1:2 1:1
0 0 1 1:4 1:2
0 1 0 1:8 1:4
0 1 1 1:16 1:8
1 0 1 1:64 1:32
1 1 0 1:128 1:64
1 1 1 1:256 1:128

Figura 2 Tabla de bits correspondientes al prescaler o al temporizador perro guardián.


El valor del divisor de frecuencia se selecciona al combinar estos tres bits. Como se
muestra en la anterior tabla, el valor del divisor de frecuencia se le asigna al temporizador
(Timer0) o al temporizador perro guardián (WDT).

1.2 Registro INTCON


El registro INTCON contiene varios bits de habilitación y de bandera para el
desbordamiento en el registro TMR0, e interrupciones por el cambio del estado en el puerto
PORTB y las interrupciones externas en el pin INT.

Figura 3 Bits del registro INTCON


GIE - Global Interrupt Enable bit - (bit de habilitación de interrupciones globales) controla
simultáneamente todas las fuentes de interrupciones posibles.
 1 - Habilita las interrupciones no enmascaradas.
 0 - Deshabilita las interrupciones no enmascaradas.
PEIE - Peripheral Interrupt Enable bit (bit de habilitación de interrupciones periféricas) es
similar al bit GIE, sin embargo controla interrupciones habilitadas por los periféricos. Eso
significa que no influye en interrupciones causadas por el temporizador Timer0 o por el
cambio del estado en el puerto PORTB o por el cambio en el pin RB0/INT.
7

 1 - Habilita las interrupciones periféricas no enmascaradas.


 0 - Deshabilita las interrupciones periféricas no enmascaradas.
T0IE - TMR0 Overflow Interrupt Enable bit (bit de habilitación de interrupciones por el
desbordamiento del temporizador Timer0) controla interrupciones causadas por el
desbordamiento del Timer0.
 1 - Habilita interrupciones por Timer0.
 0 - Deshabilita interrupciones por Timer0.
INTE - RB0/INT External Interrupt Enable bit (bit de habilitación de la interrupción
externa en RB0) controla interrupciones causadas por el cambio del estado lógico en el pin
de entrada RB0/INT (interrupción externa).
 1 - Habilita interrupciones externas INT.
 0 - Deshabilita interrupciones externas INT.
RBIE - RB Port Change Interrupt Enable bit (bit de habilitación de interrupciones por
cambios en el puerto PORTB). Cuando se configuran como entradas, los pines en el puerto
PORTB pueden causar una interrupción al cambiar el estado lógico (no importa si se
produce bajada o subida de tensión, lo que importa es que se produce un cambio). Este bit
determina si una interrupción va a ocurrir.
 1 - Habilita interrupciones por cambio en el puerto PORTB.
 0 - Deshabilita interrupciones por cambio en el puerto PORTB.
T0IF - TMR0 Overflow Interrupt Flag bit (bit de bandera de interrupción por el desbor
damiento del Timer0) detecta el desbordamiento en el registro del temporizador Timer0, o
sea el contador se pone a cero.
 1 - En el registro del Timer0 ha ocurrido desbordamiento (esta bandera debe
volverse a 0 por software).
 0 - En el registro del Timer0 no ha ocurrido desbordamiento.
INTF - RB0/INT External Interrupt Flag bit (bit de bandera de interrupción externa en INT)
detecta el cambio en el estado lógico en el pin INT.
 1 - Ha ocurrido una interrupción externa por INT (esta bandera debe volverse a 0
por software)
 0 - No ha ocurrido una interrupción externa por INT.
RBIF - RB Port Change Interrupt Flag bit (bit de bandera de interrupción por cambio en el
puerto RB) detecta cualquier cambio del estado lógico de alguno de los pines de entrada en
el puerto PORTB.
 1 - Al menos uno de los pines de E/S de propósito general en el puerto PORTB ha
cambido de valor. Después de leer el puerto PORTB, el bit RBIF debe volverse a 0
por software).
8

 0 - Ninguno de los pines de E/S de propósito general en el puerto PORTB ha


cambiado de valor.

Desarrollo
Para llevar a cabo dicha práctica, se realizaron los cálculos correspondientes para obtener
los valores que se necesitarían para que el contador estuviese proporcionando un retardo de
0.5 segundos, los cuales son los siguientes:
Fosc 4 MHz
Frec . ciclo= = =1 MHz
4 4
1
Tiempo=Tcy= =1 μseg
1 MHz
Tiempo deseado 0.5 seg
¿ Tcys= = =500,000
Tcy 1 μseg
Con esto deducimos:
500,000=(¿ sobrepasamientos)(¿ pulsos /sobrepasamiento)( prescalador)
El prescalador tiene valores constantes, así que se estuvieron haciendo combinaciones hasta
lograr que nos diera un valore entero. Entre los valores que resultaron correctos para la
práctica son los siguientes:

( sobrepasamientos
( 250¿ sobrepasamientos ) 250 ¿
pulsos
) ( 8 prescalador ) =500,000
( 125¿ sobrepasamientos ) (250 ¿
sobrepasamientos )
pulsos
( 16 prescalador )=500,000

Por lo que se tomó la combinación de 16 de prescalador. Por lo que los valores del registro
OPTION_REG fueron los siguientes:
RBPU INTEDG T0CS T0SE PSA PS2 PS1 PS0
1 1 0 1 0 0 1 1 =D3

Los valores que se asignaron al registro INTCON para activar las interrupciones son:
GIE PEIE T0IE INTE RBIE T0IE INTF RBIF
1 0 1 0 0 0 0 0

Ya que se obtuvieron los valores, se procedió con el diseño del diagrama de flujo, el cual
nos estaría facilitando el proceso al momento de realizar el programa en el programa
9

MPLAB X IDE. Teniendo en mente el objetivo, se realizaron dos diagramas de flujo, los
cuales estaban conectados, esto debido a que no se contaría con la función de retardo.

Figura 4 Diagrama de flujo que corresponde a la configuración de variables y el Timer0.


10

Figura 5 Diagrama que indica la interrupción del programa.

Con el diagrama ya listo, se procede a la codificación, para ello se estaría utilizando el


programa MPLAB X IDE, donde se obtuvo el siguiente código que cumple con el objetivo
establecido.
11

Figura 5 Código del programa en MPLAB X IDE.


12

Una vez con el programa finalizado se procede a realizar las pruebas desde ese mismo
programa, para ello es necesario hacer comentario la todos los goto salir y al goto aqui,
debido a que no nos permitiría verificar el código, todo esto con el uso de “;”

Figura 6 Colocación del punto y coma para poder correr el código.


Como se demuestra en la siguiente imagen, se procedió a realizar la prueba del código
desde el programa MPLAB X IDE para confirmar que el funcionamiento sea el correcto,
para ello se estuvo observando la forma en la que cambiaban los valores dichos elementos
conforme avanzaba el código.

Figura 7 Verificación de los valores del Puerto B y el registro STATUS.


Cuando se termina de probar el programa, es necesario quitar el “;” que se colocó en las
diferentes partes del código para poder correrlo tanto en físico como en el Proteus.
Para verlo de manera más gráfica, se desarrolla el circuito mediante el programa Proteus, en
el cual estaremos realizando la conexión de un PIC16F887, así mismo con su respectiva
fuente, leds y resistencias, quedando como se muestra en la siguiente imagen.

Figura 8 Circuito desarrollado en Proteus.


13

Una vez que se cuenta con el circuito en Proteus, se procede a realizar la importación del
archivo .hex generado al compilar nuestro programa en el programa MPLAB X IDE, cuya
ubicación en mi caso es la siguiente dirección:
C:\Users\Efren\Documents\Microcontroladores\Proyectos PICs\Ensamblador\Practica3.X\
dist\default\production
Para ello se debe dar doble clic al microprocesador y posteriormente seleccionar el archivo
como se muestra a continuación:

Doble Dar clic en la carpeta para


clic buscar el archivo .hex del
proyecto, también se debe
poner la frecuencia con la que
trabajará el microcontrolador

Figura 9 Importación del archivo .hex a Proteus.

Una vez importado nuestro archivo, se procede a correr la simulación, donde se pudo
observar el siguiente resultado:

Figura 10 Simulación en Proteus durante la etapa de encendido (imagen derecha) y apagado


(imagen izquierda).
Una vez finalizado el código, es compilado y se corre en Proteus de la misma forma, donde
podemos observar que tenemos el mismo resultado como con el código desarrollado en
ensamblador.
14

Para hacerlo en físico, se conecta de la misma forma que en el Proteus, sin embargo, es
necesario cargar al PIC el programa mediante el uso del programador de pic’s y el
programa PICKit 2 Programmer. En este programa es muy simple el realizarlo, solo es
cuestión de que la computadora reconozca el PIC, se importe el archivo .hex y se complete
la programación.

Figura 11 Mensaje que aparece al completar la programación del PIC.


Finalmente, realizado la programación del PIC, se coloca en el protoboard y se concluye de
dicha forma la práctica.

Figura 12 Diagrama del circuito y fotografía del circuito montado en protoboard.

Recordar que la resistencia que se utilizó fue de 330Ω esto debido a que el led solo puede
soportar como máximo 20mA, sin embargo, en la vida real se utiliza un valor distinto el
cual es un margen razonable de seguridad, por lo que se estaría tomando un valor de 15mA,
aplicando la siguiente formula es que obtenemos dicho valor:
V 5V
R= = =333.333 Ω ≈ 330Ω
I 15 mA
15

Material y/o equipo utilizado


 PIC 16F887
 Programador de PIC’s
 8 LED’s
 8 Resistencias de 330Ω
 1 Resistencia de 1KΩ
 Fuente de alimentación de 5V
 Computadora con los softwares siguientes:
 Proteus
 MPLAB X IDE
 PICKit 2

Conclusiones
Mediante esta práctica se pudo conocer el funcionamiento de dos registros muy útiles, los
cuales son el OPTION_REG y el INTCON, los cuales se emplearon para generar un retardo
producto de una interrupción por parte del Timer0.
Con la realización de dicha práctica se pudo observar el funcionamiento de las
interrupciones en un microcontrolador y como es que se debe configurar los dos registros
para que se pueda atender en el momento que se requiere.

Fuentes de información

3.1 Características Básicas del PIC16f887. 02/03/2019, de MIKROE Sitio web:


https://www.mikroe.com/ebooks/microcontroladores-pic-programacion-en-c-con-
ejemplos/caracteristicas-basicas-del-pic16f887
3.2 Principales registros SFR. 03/03/2019, de MIKROE Sitio web:
https://www.mikroe.com/ebooks/microcontroladores-pic-programacion-en-c-con-
ejemplos/principales-registros-sfr
Microchip Technology Inc.. (2009). PIC16F882/883/884/886/887 Data Sheet.

También podría gustarte