- Materiales necesarios:
- Qué son las interrupciones y dónde usarlas:
- Diagrama de circuito y explicación:
- Simulación de interrupciones en microcontrolador PIC:
- Explicación del código:
- Funcionamiento de las interrupciones PIC16F877A:
En este tutorial aprenderemos cómo usar una interrupción externa en el microcontrolador PIC y por qué / dónde las necesitaremos. Esto es parte de la secuencia de tutoriales de PIC en la que empezamos a aprender los microcontroladores PIC desde cero; por lo tanto, este tutorial asume que está familiarizado con cómo programar una MCU PIC usando MPLABX y cómo conectar una pantalla LCD con PIC. De lo contrario, vuelva a sus respectivos enlaces y léalos, porque me saltaré la mayor parte de la información que ya estaba cubierta allí.
Materiales necesarios:
- Tablero de perforación PIC16F877A
- Pantalla LCD 16x2
- Presionar el botón
- Conexión de cables
- Tabla de pan
- PicKit 3
Qué son las interrupciones y dónde usarlas:
Antes de adentrarnos en cómo programar las interrupciones del microcontrolador PIC, comprendamos qué es realmente una interrupción y dónde necesitaríamos usarlas. Además, hay muchos tipos de interrupciones en el microcontrolador y el PIC16F877A tiene aproximadamente 15 de ellas. No los confundamos a todos en nuestra cabeza por ahora.
¡Entonces! ¿Qué es una interrupción en los microcontroladores?
Como todos sabemos, los microcontroladores se utilizan para realizar un conjunto de activaciones predefinidas (programadas) que desencadenan las salidas necesarias en función de la entrada. Pero, mientras su microcontrolador está ocupado ejecutando una parte del código, puede haber una situación de emergencia en la que otra parte de su código necesite atención inmediata. Esta otra pieza de código que necesita atención inmediata debe tratarse como una interrupción.
Por ejemplo: consideremos que estás jugando tu juego favorito en tu móvil y el controlador (supuesto) dentro de tu teléfono está ocupado lanzando todos los gráficos necesarios para que disfrutes del juego. Pero, de repente, tu novia llama a tu número. Ahora, lo peor que puede pasar es que el controlador de tu móvil no haga caso de la llamada de tu novia ya que estás ocupado jugando. Para evitar que suceda esta pesadilla, usamos algo llamado interrupciones.
Estas interrupciones siempre estarán activas en la lista para que ocurran algunas acciones en particular y cuando ocurren, ejecutan un fragmento de código y luego vuelven a la función normal. Este fragmento de código se denomina rutina de servicio de interrupción (ISR). Un proyecto práctico en el que la interrupción es obligatoria es "Circuito del cuentakilómetros y velocímetro digital con microcontrolador PIC"
En los microcontroladores hay dos tipos principales de interrupciones. Son interrupción externa e interrupción interna. Las interrupciones internas ocurren dentro del Microntroller para realizar una tarea, por ejemplo, interrupciones de temporizador, interrupciones de ADC, etc. Estas interrupciones son activadas por el software para completar la operación del temporizador o la operación de ADC, respectivamente.
La interrupción externa es la que puede ser activada por el usuario. En este programa aprenderemos cómo usar una interrupción externa usando un botón para disparar una interrupción. Usaremos una pantalla LCD para mostrar los números que se incrementan de 0 a 1000 y cuando se dispara una interrupción debemos notificarla desde el ISR de rutina del servicio de interrupción y luego continuar incrementando los números.
Diagrama de circuito y explicación:
El diagrama de circuito para usar interrupciones PIC16F877 se muestra en la imagen de arriba. Simplemente tiene que conectar la pantalla LCD al PIC como hicimos en el tutorial de interfaz LCD.
Ahora para conectar el pin de interrupción, debemos mirar la hoja de datos para saber qué pin del PIC se usa para la interrupción externa. En nuestro caso i n PIC16F877A el 33 rd pin RBO / INT se utiliza para la interrupción externa. No puede utilizar ningún otro pin que no sea este. La conexión de pines para este diagrama de circuito se muestra en la tabla siguiente.
S. No: |
Número de PIN |
Nombre de PIN |
Conectado a |
1 |
21 |
RD2 |
RS de LCD |
2 |
22 |
RD3 |
E de LCD |
3 |
27 |
RD4 |
D4 de LCD |
4 |
28 |
RD5 |
D5 de LCD |
5 |
29 |
RD6 |
D6 de LCD |
6 |
30 |
RD7 |
D7 de LCD |
7 |
33 |
RBO / INT |
Presionar el botón |
Hemos habilitado resistencias pull up internas en el PUERTO B, por lo tanto, podemos conectar directamente el pin RB0 a tierra a través de un botón. Entonces, cuando este pin se ponga BAJO, se activará una interrupción.
Las conexiones se pueden hacer en una placa de pan como se muestra a continuación.
Si ha estado siguiendo nuestros tutoriales, debería haberse familiarizado con esta placa de rendimiento que he usado aquí. Si no es así, no necesita pensar mucho en ello, simplemente siga el diagrama del circuito y hará que todo funcione.
Simulación de interrupciones en microcontrolador PIC:
La simulación para este proyecto se realiza utilizando Proteus.
Cuando simule el proyecto, debería ver una secuencia de números que se incrementa en la pantalla LCD. Esto sucede dentro del bucle principal y cada vez que se presiona el botón, la pantalla LCD debe mostrar que ha entrado en ISR. Puede realizar sus modificaciones en el código e intentar probarlo aquí.
Explicación del código:
El código completo para este proyecto se puede encontrar al final de este tutorial. Sin embargo, el programa se divide en partes importantes y se explica a continuación para su mejor comprensión.
Como todos los programas, debemos comenzar el código definiendo la configuración de los pines que usamos en nuestro programa. También aquí necesitamos definir que estamos usando RB0 / INT como un pin de interrupción externo y no como un pin de entrada o salida. El debajo de la línea de código permite a la resistencia pull-up interna en PORTB haciendo que el 7 ésimo bit como 0.
OPTION_REG = 0b00000000;
Luego habilitamos las interrupciones globales / periféricas y declaramos que estamos usando RB0 como un pin de interrupción externo.
GIE = 1; // Habilitar interrupción global PEIE = 1; // Habilita la interrupción de periféricos INTE = 1; // Habilita RB0 como pin de interrupción externo
Una vez que el pin RB0 se define como un pin de interrupción externo, cada vez que se pone bajo, el indicador de interrupción externa INTF se convertirá en 1 y el código dentro de la función de interrupción nula se ejecutará ya que se llamará la Rutina de servicio de interrupción (ISR).
void interrupt ISR_example () {if (INTF == 1) // Interrupción externa detectada {Lcd_Clear (); Lcd_Set_Cursor (1,1); Lcd_Print_String ("ISR ingresado"); INTF = 0; // limpia la bandera de interrupción después de terminar __delay_ms (2000); Lcd_Clear (); }}
Como puede ver, he nombrado la función de interrupción como ISR_example. Puede nombrarlo según su deseo. Dentro de la función de interrupción, comprobaremos si la bandera INTF está alta y realizaremos las acciones necesarias. Es muy importante borrar el indicador de interrupción una vez que haya terminado con la rutina. Solo entonces el programa volverá a anular la función principal. Esta limpieza debe realizarse mediante software utilizando la línea
INTF = 0; // limpia la bandera de interrupción después de terminar con ella
Dentro de la función principal, simplemente incrementamos un número por cada 500 ms y lo mostramos en la pantalla LCD. No tenemos ninguna línea específica para comprobar el estado del pin RB0. La interrupción siempre permanecerá activa y cada vez que se presione el botón pulsador saltará del vacío principal y ejecutará las líneas en el ISR.
Lcd_Set_Cursor (2,1); Lcd_Print_String ("Dentro del bucle principal"); Lcd_Set_Cursor (1,1); Lcd_Print_String ("Número:"); Lcd_Print_Char (ch1 + '0'); Lcd_Print_Char (ch2 + '0'); Lcd_Print_Char (ch3 + '0'); Lcd_Print_Char (ch4 + '0'); __delay_ms (500); número ++;
Funcionamiento de las interrupciones PIC16F877A:
Una vez que haya entendido cómo funciona la interrupción, puede probarla en el hardware y manipularla. Este programa dado aquí es un ejemplo muy básico de interrupción externa donde simplemente cambia la visualización de la pantalla LCD cuando se detecta una interrupción.
El funcionamiento completo del proyecto se puede encontrar en el video que se muestra a continuación. Espero que haya entendido acerca de las interrupciones y dónde / cómo usarlas. Si tienes alguna duda puedes contactarme a través de los foros o mediante la sección de comentarios.