Interrupciones externas «entradas digitales», Pic C Compiler

En esta sección aprenderás a programar las interrupciones externas (INT0, INT1, INT2), el objetivo es programar las interrupciones para que al recibir una señal digital de entrada se encienda un LED correspondiente dependiendo del pin de interrupción que recibe la señal.


Las interrupciones externas son una función importante en los microcontroladores que les permite responder de manera rápida y eficiente a eventos externos. Una interrupción externa es una señal que proviene de una fuente externa al microcontrolador, como un pulsador, un sensor o cualquier otro dispositivo.

Cuando se produce una interrupción externa, el microcontrolador suspende temporalmente la ejecución del programa principal y salta a una rutina de interrupción específica para manejar el evento. Una vez que se completa la rutina de interrupción, el microcontrolador regresa al programa principal y continúa su ejecución desde donde se detuvo.

La principal ventaja de utilizar interrupciones externas es que permiten una respuesta rápida a eventos en tiempo real sin tener que realizar un escaneo constante de los dispositivos externos. Esto es especialmente útil en aplicaciones donde se requiere un alto grado de sensibilidad y tiempos de respuesta precisos.

La configuración de las interrupciones externas varía según el microcontrolador y el lenguaje de programación utilizado. En general, se deben seguir los siguientes pasos para utilizar interrupciones externas:

  • Configurar el hardware: Esto implica conectar el dispositivo externo al microcontrolador y configurar los pines apropiados como entradas para recibir las señales de interrupción.
  • Habilitar las interrupciones externas: Esto se realiza mediante registros o configuraciones específicas del microcontrolador. Se debe indicar qué eventos externos se considerarán como interrupciones y qué acciones se tomarán cuando se produzcan.
  • Escribir la rutina de interrupción: Esta es la sección de código que se ejecutará cuando se produzca una interrupción. Aquí se realizan las acciones necesarias para responder al evento externo.
  • Configurar las prioridades de las interrupciones: Si hay múltiples interrupciones externas, se pueden establecer prioridades para determinar cuál se atenderá primero en caso de que ocurran simultáneamente.

Es importante tener en cuenta que el manejo de interrupciones externas debe ser cuidadosamente planificado y programado, ya que una mala gestión puede ocasionar problemas de sincronización y comportamientos no deseados en el sistema. Además, es fundamental entender el funcionamiento específico del microcontrolador que estás utilizando consultando la documentación y las hojas de datos correspondientes.

Interrupción externa

La cantidad de pines de interrupción externa depende del microcontrolador.

Por ejemplo, el PIC18F4550 tiene 3 pines de interrupción externa:

  • INT0 (RB0)
  • INT1 (RB1)
  • INT2 (RB2)

Existen tres formas para habilitar la interrupción externa:

INT_EXT: Habilita la interrupción cuando detecta un flanco de subida.

INT_EXT_L2H: Habilita la interrupción cuando detecta un flaco de bajada seguido de un flanco de subida.

INT_EXT_H2L: Habilita la interrupción cuando detecta un flaco de subida seguido de un flanco de bajada.

Para habilitar la interrupción se pueden utilizar las siguientes funciones.


   enable_interrupts(INT_EXT);
   enable_interrupts(INT_EXT1);
   enable_interrupts(INT_EXT2);

   enable_interrupts(INT_EXT_L2H);
   enable_interrupts(INT_EXT1_L2H);
   enable_interrupts(INT_EXT2_L2H);
   
   enable_interrupts(INT_EXT_H2L);
   enable_interrupts(INT_EXT1_H2L);
   enable_interrupts(INT_EXT2_H2L);

Cuando se habilita una interrupción el programa se alojara en la directiva dependiendo de la interrupción utilizada.


   #INT_EXT  // INT0 (RB0)
   #INT_EXT1 // INT1 (RB1)
   #INT_EXT2 // INT2 (RB2)

Ejemplo 1: Interrupción Externa 

El objetivo es utilizar un botón conectado a cada pin de interrupción para encender un LED correspondiente cuando se habilite la interrupción.

Circuito de conexión

La señal de salida del botón es un estado bajo si no esta pulsado el botón y es un estado alto si se pulsa el botón (PULL DOWN).

Funcionamiento

Inicialmente de definen los pines de entrada conectados a los botones que también son los pines de interrupción, y se definen los pines de salida para encender los LEDs.


#define boton1 input(pin_b0)
#define boton2 input(pin_b1)
#define boton3 input(pin_b2)

#define led1 pin_d0
#define led2 pin_d1
#define led3 pin_d2

Se habilitan las interrupciones globales y las interrupciones externas.

INT_EXT: Habilita la interrupción cuando detecta un flanco de subida.


   enable_interrupts(GLOBAL);  
   enable_interrupts(INT_EXT);
   enable_interrupts(INT_EXT1);   
   enable_interrupts(INT_EXT2);

Cando de activa la interrupción, el programa se aloja en la directiva de la interrupción «#INT_EXT» y después baja a la subrutina «Interrupt_boton1()».


#INT_EXT
void Interrupt_boton1() 
{ 
}

Dentro de la subrutina, se enciende el LED, y con la función «while(boton1)» esperamos a recibir la señal de flanco de bajada o cuando se deje de pulsar el botón para apagar el LED. 


#INT_EXT
void Interrupt_boton1() 
{ 
   delay_ms(1); //antirrebote
   OUTPUT_BIT(led1,1);
   while(boton1) // mientras esta pulsado, espera
   {}
   OUTPUT_BIT(led1,0);
}

Las siguientes interrupciones «INT_EXT1″, » INT_EXT2″ tienen el mismo funcionamiento.

Código completo: Interrupción Externa 


#FUSES NOMCLR

#define boton1 input(pin_b0)
#define boton2 input(pin_b1)
#define boton3 input(pin_b2)

#define led1 pin_d0
#define led2 pin_d1
#define led3 pin_d2

#INT_EXT
void Interrupt_boton1() 
{ 
   delay_ms(1); //antirrebote
   OUTPUT_BIT(led1,1);
   while(boton1) // mientras esta pulsado, espera
   {}
   OUTPUT_BIT(led1,0);
}

#INT_EXT1
void Interrupt_boton2() 
{ 
   delay_ms(1); //antirrebote
   OUTPUT_BIT(led2,1);
   while(boton2) // mientras esta pulsado, espera
   {}
   OUTPUT_BIT(led2,0);
}

#INT_EXT2
void Interrupt_boton3()
{ 
   delay_ms(1); //antirrebote
   OUTPUT_BIT(led3,1);
   while(boton3) // mientras esta pulsado, espera
   {}
   OUTPUT_BIT(led3,0);
}
               
void main()
{

   enable_interrupts(GLOBAL);  
   enable_interrupts(INT_EXT);
   enable_interrupts(INT_EXT1);   
   enable_interrupts(INT_EXT2);

   while(TRUE)
   {
   
   }

}

Ejemplo 2: Interrupción Externa H2L

El objetivo es utilizar un botón conectado a cada pin de interrupción para encender un LED correspondiente cuando se habilite la interrupción en una configuración H2L.

Circuito de conexión

La señal de salida del botón, es un estado alto si no esta pulsado el botón y es un estado bajo si se pulsa el botón (PULL UP).

Funcionamiento

Inicialmente de definen los pines de entrada conectados a los botones que también son los pines de interrupción, y se definen los pines de salida para encender los LEDs.


#define boton1 input(pin_b0)
#define boton2 input(pin_b1)
#define boton3 input(pin_b2)

#define led1 pin_d0
#define led2 pin_d1
#define led3 pin_d2

Se habilitan las interrupciones globales y las interrupciones externas.

INT_EXT_H2L: Habilita la interrupción cuando detecta un flaco de subida seguido de un flanco de bajada.


   enable_interrupts(GLOBAL);  
   enable_interrupts(INT_EXT);
   enable_interrupts(INT_EXT1);   
   enable_interrupts(INT_EXT2);

Cando de activa la interrupción, el programa se aloja en la directiva de la interrupción «#INT_EXT» y después baja a la subrutina «Interrupt_boton1()».


#INT_EXT
void Interrupt_boton1() 
{ 
}

Dentro de la subrutina, se enciende el LED, y con la función «while(boton1)» esperamos a recibir la señal de flanco de subida o cuando se deje de pulsar el botón para apagar el LED. 


#INT_EXT
void Interrupt_boton1() 
{ 
   delay_ms(1); //antirrebote
   OUTPUT_BIT(led1,1);
   while(!boton1) // mientras esta pulsado, espera
   {}
   OUTPUT_BIT(led1,0);
}

Las siguientes interrupciones «INT_EXT1″, » INT_EXT2″ tienen el mismo funcionamiento.

Código completo : Interrupción Externa H2L


#FUSES NOMCLR

#define boton1 input(pin_b0)
#define boton2 input(pin_b1)
#define boton3 input(pin_b2)

#define led1 pin_d0
#define led2 pin_d1
#define led3 pin_d2

#INT_EXT
void Interrupt_boton1() 
{ 
   delay_ms(1); //antirrebote
   OUTPUT_BIT(led1,1);
   while(!boton1) // mientras esta pulsado, espera
   {}
   OUTPUT_BIT(led1,0);
}

#INT_EXT1
void Interrupt_boton2() 
{ 
   delay_ms(1); //antirrebote
   OUTPUT_BIT(led2,1);
   while(!boton2) // mientras esta pulsado, espera
   {}
   OUTPUT_BIT(led2,0);
}

#INT_EXT2
void Interrupt_boton3()
{ 
   delay_ms(1); //antirrebote
   OUTPUT_BIT(led3,1);
   while(!boton3) // mientras esta pulsado, espera
   {}
   OUTPUT_BIT(led3,0);
}
               
void main()
{

   enable_interrupts(GLOBAL);  
   enable_interrupts(INT_EXT_H2L);
   enable_interrupts(INT_EXT1_H2L);   
   enable_interrupts(INT_EXT2_H2L);

   while(TRUE)
   {
   
   }

}
Scroll al inicio