Está en la página 1de 20

Universidad Nacional Experimental del Táchira

Vicerrectorado Académico
Decanato de Docencia
Departamento de Ingeniería Electrónica
Núcleo de Electrónica y Sistemas y Digitales
Laboratorio de Sistemas Digitales II

Informe Practica Nro. 02


Manejo de interrupciones externas del
microcontrolador PIC 18F4550.

Autor:
Victorino Villamizar Delgado, CIV.-23.541.989
Grupo Nº 10
San Cristóbal, Julio, 2021
Introducción

Los microcontroladores son herramientas versátiles que nos permiten resolver un sinfín de
tareas, tan solo debemos proporcionarle esas instrucciones que seguirán al pie de la letra,
evaluando y planteando cualquier eventualidad que se presente en nuestra aplicación, como
resolverla y con que prioridad hacerlo, para que su ejecución sea lo más rápida y optima
posible. Al plantearnos esto nos damos cuenta que no es solo colocar el código y que se
ejecute por sí solo, sino que se debe indicar cuando hacerlo y si debería paralizar una tarea
para atender otra de mayor importancia.
Por lo anterior, debemos aprender a gestionar la configuración de las interrupciones externas
de nuestro pic, para que haga tareas que se activen de manera automática por medio de un
agente externo, y no solo eso, también manejar los niveles de prioridad para dichas
interrupciones, para que se preste atención inmediata a las que así lo requieran.
Para eso debemos conocer los tipos de interrupciones que tenemos a nuestra disposición, para
así utilizar el que mejor se acople a nuestras necesidades según sea el caso.
Marco teórico

1)Tipos de interrupciones externas que maneja el PIC 18F4550.

a) Fuentes de interrupción Externas (Enmascarables).

 Interrupciones externas en terminales (PORTB 0, 1 y 2).


 Cambios en niveles lógicos de terminales (PORTB 4, 5, 6 y 7)
 Escritura/Lectura del puerto paralelo (Modo Esclavo).
 Recepción en la USART.
 Transmisión en la USART.
 Transmisión/Recepción del puerto serial síncrono (Modo Maestro).
 Captura o Comparación de los módulos CCP (1 y 2).

b) Fuentes de interrupción Externas (No Enmascarables).

 Botón de RESET.

2)Priorización de interrupciones en el PIC 18F4550.

Podemos definir dos modos de interrupciones. En el primero, denominado modo de


compatibilidad, todas las interrupciones tienen la misma prioridad. La rutina de servicio de
interrupciones (ISR) debe colocarse en la posición 0x0008 de la memoria. En este modo,
mientras se está ejecutando una interrupción ninguna otra puede atenderse.

En el segundo modo las interrupciones pueden asignarse a dos niveles de prioridad. Las
interrupciones de alta prioridad siguen saltando a la posición 0x0008, mientras que las de baja
van a la 0x0018. En este caso una interrupción de alta prioridad puede interrumpir a una de
baja, pero no al contrario.

La elección de un modo u otro depende del valor del bit IPEN (Interrupt Priority Enable) del
registro RCON.
#define enable_priority_levels RCONbits.IPEN=1
#define disable_priority_levels RCONbits.IPEN=0

Interrupciones primarias: Cinco fuentes de interrupción tienen sus bits de habilitación


localizados en los registros INTCON. Estas fuentes de interrupción son referidas como
“interrupciones primarias”. Para habilitar estas interrupciones solo es necesario poner a ‘1’ el
bit GIE/GIEH del registro INTCON.
Limpiar una bandera de interrupción antes de habilitar las interrupciones, previene de activar
solicitudes de interrupción pendientes y que esto desencadene una interrupción de forma
inmediata.
Interrupciones de periféricos: El PIC 18F4520 es capaz de generar solicitudes de
interrupción para cada una de sus banderas de interrupción localizadas en los registros PIE.
Para habilitar una interrupción por periférico además de habilitar el GIE/GIEH se debe poner
a ‘1’ también el bit PEIE/GIEL ambos en el registro INTCON.
En el modo de compatibilidad los bits INTCON.GIE e INTCON.PEIE que
habilitaban/deshabilitaban de forma global las interrupciones pasan a denominarse GIEH
(Global Int Enable High) y GIEL (Global Int Enable Low) y gobiernan la activación en
bloque de las interrupciones de alta y baja prioridad respectivamente:
Global flags (with priority levels)
#define enable_high_ints INTCONbits.GIEH=1
#define enable_low_ints INTCONbits.GIEL=1
#define disable_high_ints INTCONbits.GIEH=0
#define disable_low_ints INTCONbits.GIEL=0

3)Directivas del compilador para interrupciones del pic 18F4550.


Para realizar la configuración, inspección y control de las interrupciones el 18F4520 utiliza un
total de 10 registros:

 GIE/GIEH – Habilitación global de interrupciones / Habilitación global de


interrupciones de alta prioridad.
 PEIE/GIEL – Habilitación de interrupción de periféricos / Habilitación global de
interrupciones de baja prioridad.
 TMR0IE – Habitación de interrupción por desborde del TIMER (Temporizador) 0.
 INT0IE – Habilitación de interrupción externa 0.
 RBIE – Habilitación de la interrupción por cambios en el Puerto B.
 TMRIF – Bandera de interrupción por desborde del TIMER 0 (Debe ser limpiada
mediante software).
 INT0IF – Bandera de interrupción externa 0 (Debe ser limpiada mediante
software).
 RBIF – Bandera de interrupción cambios en el Puerto B (Debe ser limpiada
mediante software).

 RBPU – Habilitación de Pull-Up en el Puerto B.


 INTEDG0 – Selección de flanco de la interrupción externa 0.
 INTEDG1 – Selección de flanco de la interrupción externa 1.
 INTEDG2 – Selección de flanco de la interrupción externa 2.
 TMR0IP – Nivel de prioridad de la interrupción por desborde del TIMER 0.
 RBIP - Nivel de prioridad de la interrupción por cambios en el Puerto B.

 INT2IP – Nivel de prioridad de la interrupción externa 2.


 INT1IP – Nivel de prioridad de la interrupción externa 1.
 INT2IE – Habilitación de interrupción externa 2.
 INT1IE – Habilitación de interrupción externa 1.
 INT2IF – Bandera de interrupción externa 2 (Debe ser limpiada mediante software).
 INT1IF – Bandera de interrupción externa 1 (Debe ser limpiada mediante software)
 PSPIE – Habilitación de interrupción por escritura/lectura de puerto paralelo esclavo.
 ADIE – Habilitación de interrupción por el convertidor analógico – digital (ADC).
 RCIE – Habilitación de interrupción por recepción en USART.
 TXIE – Habilitación de interrupción por transmisión en USART.
 SSPIE – Habilitación de interrupción por el puerto serial síncrono maestro (MSSP).
 CCP1IE – Habilitación de interrupción por el módulo CCP1.
 TMR2IE – Habilitación de interrupción por comparación del TIMER 2 con el registro
PR2.
 TMR1IE – Habilitación de interrupción por desbordamiento del TIMER 1.

 OSCFIE – Habilitación de interrupción por falla en el oscilador.


 CMIE – Habilitación de interrupción por el comparador.
 EEIE – Habitación de interrupción por operación de escritura de datos en memoria
EEPROM/Flash.
 BCLIE – Habilitación de interrupción por colisión en BUS del MSSP.
 HLVDIE – Habilitación de interrupción por detección de voltaje alto/bajo.
 TMR3IE – Habilitación de interrupción por desbordamiento del TIMER 3.
 CCP2IE – Habilitación de interrupción por el módulo CCP2.

 PSPIF – Bandera de interrupción por escritura/lectura de puerto paralelo esclavo


(Debe ser limpiada mediante software).
 ADIF – Bandera de interrupción por el convertidor analógico – digital (ADC) (Debe
ser limpiada mediante software).
 RCIF – Bandera de interrupción por recepción en USART (Debe ser limpiada
mediante software).
 TXIF – Bandera de interrupción por transmisión en USART (Debe ser limpiada
mediante software).
 SSPIF – Bandera de interrupción por el puerto serial síncrono maestro (MSSP) (Debe
ser limpiada mediante software).
 CCP1IF – Bandera de interrupción por el módulo CCP1 (Debe ser limpiada mediante
software).
 TMR2IF – Bandera de interrupción por comparación del TIMER 2 con el registro PR2
(Debe ser limpiada mediante software).
 TMR1IF – Bandera de interrupción por desbordamiento del TIMER 1 (Debe ser
limpiada mediante software).

 OSCIF – Bandera de interrupción por falla en el oscilador (Debe ser limpiada


mediante software).
 CMIF – Bandera de interrupción por el comparador (Debe ser limpiada mediante
software).
 EEIF – Bandera de interrupción por operación de escritura de datos en memoria
EEPROM/Flash (Debe ser limpiada mediante software).
 BCLIF – Bandera de interrupción por colisión en BUS del MSSP (Debe ser limpiada
mediante software).
 HLVDIF – Bandera de interrupción por detección de voltaje alto/bajo (Debe ser
limpiada mediante software).
 TMR3IF – Bandera de interrupción por desbordamiento del TIMER 3 (Debe ser
limpiada mediante software).
 CCP2IF – Bandera de interrupción por el módulo CCP2 (Debe ser limpiada mediante
software).
4)Funciones en C que se utilizan para interrupciones externas del pic 18F4550.
Existen diferentes tipos de interrupción en el micro controlador, algunas de ellas se
mencionan a continuación:
• #INT_EXT Interrupción externa
• #INT_RTCC Desbordamiento del TIMER0 (RTCC)
• #INT_RB Cambio en uno de los pines B4,B5,B6,B7
• #INT_EEPROM Escritura en la EEPROM completada
• #INT_TIMER1 Desbordamiento TIMER1
• #INT_TIMER2 Desbordamiento TIMER2
• #INT_ADOF Conversión AD fuera de rango de tiempo.
• #INT_AD Conversión AD completa
• #INT_BUSCOL Colisión de bus.
• #INT_BUTTO Por botón (14000)
• #INT_CANERR Error en el modulo CAN.
• #INT_CANIRX Mensaje invalido en el BUS CAN
• #INT_CANRXO Bus CAN recibe un nuevo mensaje en buffer 0
• #INT_CANRXI Bus CAN recibe un nuevo mensaje en buffer 1.
• #INT_CANTXO Bus CAN transmisión completa en bufjer O.
• #INT_CANTX1 Bus CAN transmisión completa en buffer 1
• #INT_CANTX2 _ Bus CAN transmisión completa en bufjer 2.
• #INT_CANWAKE Bus CAN evento de activación o wake-up.
• #INT_CCP1 Unidad 1 de captura, comparación y PWM.
• #INT_CCP2 Unidad 2 de captura, comparación y PWM.
• #INT_CCP3 Unidad 3 de captura, comparación y PWM,
• #INT_CCP4 Unidad 4 de captura, comparación y PWM.
• #INT_CCP5 Unidad 5 de captura, comparación y PWM.
• #INT_COMP Comparador,
• #INT_COMPI Comparador1.
En nuestro caso que usaremos interrupciones externas Los pasos que se deben seguir para
atender una interrupción, son los siguientes:
• Habilitar el modo de prioridad de interrupciones #device high_ints=TRUE
• Digitar la función correspondiente a la interrupción. La función debe comenzar
con # y la interrupción correspondiente, por ejemplo, para la función de interrupción
por RB0 se digita #int_EXT, RB1 #int_EXT1 HIGH (el HIGH me indica alta
prioridad, pero por defecto estará por debajo de la interrupción de RB0) y RB2
#int_EXT2, esta seria la de menor prioridad.
• En el programa principal, habilitar las interrupciones en forma global, con la
instrucción: enable_interrupts(GLOBAL);
• En el programa principal, habilitar la interrupción correspondiente, como ejemplo se
muestra como habilitar la interrupción externa por
RB0: enable_interrupts(INT_EXT);

Diseño Metodológico

a) Configuración de los periféricos empleados:

 LCD grafico con controlador KS0108:

Se configurará el puerto C como salida. En este puerto se conectarán los pines de control de la
LCD grafica.

El puerto D se configuro como salida y en él se conectarán los pines de transferencia de datos


de la LCD grafica.
 Pulsadores

Estos se conectarán en el puerto B, el cual se declaro como entrada. En


los siguientes pines del PIC18F4550:

 Led’s

Estos los conectaremos al puerto A del


PIC18F4550, el cual se configuro como salida
b) Diagrama Esquemático del diseño:

c) Diagrama de flujo del programa principal y de cada función diseñada.

A continuación, podemos ver el programa principal donde declaramos los puertos y


dejamos apagados los led’s y las funciones que este llama, como son inicio_LCD()
que me inicializa la lcd y me muestra el membrete de la pantalla; también la función
interrupciones() aquí habilitaremos las interrupciones externas de manera global y le
indicaremos su activación por el flancos de subida .
Las siguientes funciones son las ejecutadas por medio de las interrupciones externas activadas
mediante los pines RB0, RB1 y RB2.
d) Procedimiento de diseño de la aplicación.

1) Primero se realizó una investigación del tema central el cual es la base de la


aplicación, este tema es el de las interrupciones externas en el PIC18F4550.
2) Se realizo un análisis de los requerimientos a cumplir, tanto de los elementos que se
podían utilizar como de sus funciones a realizar.
3) Se procedió a realizar el esquema de conexión en proteus con los elementos a utilizar
para la aplicación.
4) Empezó a desarrollarse la lógica de programación para poder cumplir todos los
requerimientos.
5) Por último, se fue simulando a medida que se desarrollaba el código hasta llegar a su
estado final cumpliendo todas las pautas.

e) Manual de uso de la aplicación diseñada.

1) Previamente depositada la fruta en sus respectivos contenedores para ser transportada


por las bandas empacadoras, se procede a encender el equipo.
2) Al momento que se deposite una fruta, dependiendo de cuál sea se encenderá un led de
diferente color.
3) Por medio de la pantalla LCD se verifica el conteo de las frutas empacadas en cada
caja.
4) Una vez llena cada caja en la pantalla LCD se montará la palabra “FULL” al lado de la
respectiva fruta y la banda procederá a detenerse.
5) Después de cambiar la caja llena por una vacía, se procederá a presionar el botón de la
respectiva banda a la cual se le cambio la caja para proceder a comenzar su llenado.
6) Los anteriores pasos se seguirán repitiendo desde el paso 2 cuantas veces quiera el
usuario hasta que apague el equipo.

Resultados
Para esta practica se cumplieron todas las características para la aplicación a diseñar, las
cuales eran:

1. Cuente la cantidad de fruta que va entrando a cada caja, para ello debe tomar en
cuenta la prioridad de la fruta, cada vez que una fruta cae en el depósito se enciende un
led por 100 ms y luego se apaga.

Primero que todo activamos los niveles de prioridad para las interrupciones con el siguiente
comando.

Luego establecemos los niveles de prioridad para cada interrupción, tomando en cuenta que el
pin B0 será la de mas alta prioridad por defecto así que no debemos indicarlo, solo se lo
indicamos a las demás interrupciones.

De esta manera la interrupción de el contador de fresa será la de prioridad 1, los contadores de


mangos y peras tendrán prioridad 2 y por ultimo las manzanas.

Para activar las interrupciones llamamos a una función llamada interrupción(), desde un while
para que el programa se siga repitiendo hasta que el usuario lo decida.

En esta función activamos las interrupciones de manera global y especifícanos que su


activación sea por flanco de subida.
El conteo se realiza al momento de ejecutarse la interrupción, se llama a una función donde se
realiza el conteo de la fruta y encendido del led.

El de la izquierda es el caso de las fresas cuyo numero de empaque es de 10 y el de la derecha


el de las manzanas el cual es de 5. Cada uno se cuenta en una variable separada y enciende
por 100ms un led diferente. Para el caso de los mangos y peras se hizo el conteo en la misma
función ya que tienen la misma prioridad, pero por comandos if para que llevaran su conteo
por separado, de la siguiente manera:

El contador1 llevara el conteo de las peras, por eso cuenta hasta 15 por caja y el contador2 el
de los mangos los cuales son 20 por caja. Ya que son llamadas con la misma interrupción pero
cada fruta ingresa a una velocidad diferente, por cada 2 peras ingresa un mango, al ingresar la
pera a una velocidad de 75ms y el mango a 150ms, por ello utilizamos dos contadores
adicionales, llamados contaa1 y contaa2, el contaa1 se inicializara en 0, y llevara el conteo de
cada ingreso de interrupción y el contaa2 se inicializara en 2, luego para contar un mango se
verifica primero que el conteo de mangos sea menor a 20 y que contaa2-contaa1=0 esto para
garantizar que ingresen a velocidades diferentes, siento el ingreso de peras a el doble de los
mangos, por ejemplo: Al activarse la primera interrupción por este pin aumentara contaa1=1,
cuenta la pera y al contar el mango este no se cuenta, ya que contaa2-contaa1=1 y no cumple
la condición para contar, en el segundo ingreso contaa1=2 y me cuenta la segunda pera y al
verificar que contaa2-contaa1=0 me cuenta el primer mango.

2. En un LCD grafico con controlador KS0108, se debe visualizar el conteo de cada


depósito.

Para cumplir esta condición se declara primero una función llamada inicio_LCD(), aquí
inicializamos la LCD, borramos la pantalla e imprimimos el membrete mostrado en la imagen
anterior. Esta función es llamada desde el mai() al iniciar el programa.

Al activarse cada interrupción, por medio de los siguientes comandos guarda en una variable
de tipo char llamada “cona” el numero anterior del conteo (de tener uno), esto se hace para
poder borrar el numero anterior y que no se sobrescriban en la lcd los números de conteo y
luego guarda en una variable char llamada “con” el número actual del contador para mostrar.

Luego se borra el numero anterior (de haber tenido uno) y se muestra el numero actual de el
contador de fruta.
Esto aplica para todas las interrupciones, lo único que cambiará será la variable “contador”,
para el caso de las fresas será “contador”, para mangos “contador2”, para peras “contador1” y
manzanas “contador3” respectivamente.
3. Una vez lleno un depósito se debe visualizar en el LCD grafico la palabra FULL y
debe parar la banda transportadora, por lo tanto, se paraliza el conteo.
Al momento de habilitarse la interrupción, anteriormente vimos que por medio de if se
verificaba que el contador fuera menor al numero de frutas que se empacaban en cada caja, al
no cumplirse esta condición el contador se detiene y se procede visualizar en la LCD la
palabra “FULL” y detener el contador.

Esto se cumple para fresas y manzanas, en el caso de los mangos y peras se hace por medio de
un if ‘s ya que están en la misma función activada por una sola interrupción.

La condición de la izquierda es para el caso de los mangos y la derecha para las peras.

4. Para reiniciar el conteo de la banda transportadora, se debe presionar un interruptor


que ponen en marcha de nuevo el motor, en ese momento, en el LCD se debe reiniciar el
conteo de la fruta correspondiente.

Estos son los pulsadores respectivos para el reinicio de cada banda, siendo
P1 para la banda de las fresas, P2 para los mangos, P3 para las peras y P4
para las manzanas.

Para los casos de fresa y manzana respectivamente el código es similar, tan solo cambia el pin
de reinicio, si en la interrupción, al momento de verificar no se cumple la condición que el
contador de cada fruta sea menor al número de frutas que se empaca se procede a detener la
banda y el conteo y mostrar el aviso “FULL”, como vimos anteriormente, y no se reinicia el
conteo y se borra el aviso a menos que se presione el respectivo pulsador de la banda.
Para el caso de los mangos y las peras esta condición se cumple por medio de if’s, si el
contador es mayor al numero de frutas que caben en cada caja respectivamente, se detiene el
conteo, la banda de llenado y me muestra el aviso “FULL” en la LCD, para reiniciarlo de
procede a presionar el respectivo pulsador y se reinicia la banda, el contador y borra la palabra
“FULL” de la LCD.
Conclusiones

Podríamos comparar el tema de las interrupciones con nuestra vida, ya que al fijarte una meta
te planteas objetivos y haces una evaluación de los pros y contras que se te puedan presentar
para seguir adelante y de presentarse varios percances debes evaluar cual seria el de mayor
prioridad que necesitaría tu atención o solución y de presentarse otro de mayor importancia
tendrías que dejar todo a un lado y resolverlo, o si crees que no es conveniente resolver uno a
la vez. Así mismo podemos plantear el tema de las interrupciones y su priorización o en dado
caso la falta de ella.
Al momento de diseñar un programa y con la finalidad de que sea mas autónomo, podemos
hacer uso de las interrupciones externas, ya que esta herramienta nos permitirá que este se
ejecute de manera más automática el proceso al no tener que estar indicándole que hacer a
cada momento al microcontrolador, ni cuando activarse, tan solo debemos indicarle las
prioridades con la que debe tomar en cuenta la interrupción que se active y especificarle que
hacer al momento de presentarse dicha interrupción. Tan bien nos presenta una gran
versatilidad, ya que no solo son las interrupciones externas activadas por los pines RB0, RB1
y RB2, las cuales utilizamos en esta práctica, sino que hay una gran variedad, de manera que
podemos adaptarlas a nuestras necesidades del programa.
Anexos
https://drive.google.com/drive/folders/1Jys6qfUMTbisuloU_2HhqUVqveAKrh9I?usp=sharin
g

También podría gustarte