Recursos del PIC. Uso de la interrupción externa por RB0/INT

Descripción dEn este ejemplo vamos a ver el uso de la interrupción externa a través de la patilla RB0/INT, para ello vamos a utilizar el PIC 16f84A, aunque si utilizas otro PIC de mayores prestaciones el proceso será el mismo.e la publicación.

Biblioman

10/3/20095 min leer

En este ejemplo vamos a ver el uso de la interrupción externa a través de la patilla RB0/INT, para ello vamos a utilizar el PIC 16f84A, aunque si utilizas otro PIC de mayores prestaciones el proceso será el mismo.

Vamos a ver las patillas y los registros del PIC implicados en el tema:

En cuanto a los pines del PIC la señal externa para producir la interrupción en el PIC será a través de de la patilla 6 y se podrá determinar por software que flanco de la señal producirá la interrupción, el de subida (cuando la señal pasa de un nivel 0 a 1) ó el de bajada (cuando pasa de 1 a 0).

Vamos a ver ahora los registros específicos (SFR) que nos proporciona el PIC para el control de esta interrupción.

  • INTEDG: flanco activo interrupción externa.

1- la interrupción se producirá en el flanco ascendente.

0- la interrupción se producirá en el flanco descendente.

  • GIE: (Habilita las interrupciones globalmente). Este bit permite que cualquier interrupción sea posible. Para poder usar cualquier interrupción hay que habilitarla globalmente e individualmente.

  • INTE: Permiso de interrupción por activación de la patilla RB0/INT

1- permite la interrupción

0- prohíbe la interrupción

  • INTF: bit de señalización (solo lectura) de interrupción externa RB0/INT

Para ver como CCS gestiona estos recursos, vamos a crear el siguiente circuito en Proteus:

El circuito es una alarma sencilla, lo que tiene que hacer es lo siguiente:

Cuando se pulse el sensor de alarma y no esté cerrado el interruptor de desactivación de alarma, se pondrá a uno la patilla RB7 del PIC el cual polarizará directamente el transistor Q1, que a su vez activará el Micro-relé RL1 (Relé auxiliar), este a su vez activará un relé de potencia que activará una alarma conectada a 220V.
Cuando queremos activar una carga con una potencia importante, es necesario adaptar el circuito de salida para poder controlar con los pocos miliamperios que nos da el PIC la carga que queramos. Hay muchas formas de hacer esto, se puede utilizar un par de transistores en configuración Darlington y atacar directamente el relé de potencia ó no utilizar relés y controlar la carga por medio de un triac, lo podéis hacer como queráis.
Una vez activada la alarma, permanecerá activa hasta que no la desactivemos por medio del interruptor de desactivación de alarma (interruptor cerrado).

Ahora vamos a crear el programa en C, para ello vamos a crear un nuevo proyecto a través del asistente, de esta forma vamos viendo las posibilidades que nos da esta herramienta, configuraremos las opciones según se muestra en las siguientes figuras:

Los demás valores dejamos los de por defecto.

Una vez creada la plantilla con el asistente, añadiremos las siguientes líneas de código para hacer nuestro programa funcional:

Nota: el asistente como ya he comentado en mas de alguna ocasión, genera dos archivos de código fuente, el .h y el .c esta es la forma correcta de trabajar en C, la famosa frase de divide y vencerás es perfectamente aplicable a la programación en C, si sigo utilizando un solo archivo para todo el código es porque de momento los archivos son muy pequeños y me resulta más cómodo incluir una imagen en el sitio en vez de dos. Realmente cuando tengamos un proyecto grande, estará formado por varios archivos .h y .c

Comentario del programa

Al igual que hacíamos con la directiva #byte para mapear un registro en la memoria RAM y utilizarlo como una variable más, con la directiva #bit identificador registro.bit podemos mapear un bit en concreto de un registro. Aunque ya vimos que CCS incluye funciones para el manejo de bits, está opción es muy cómoda de utilizar y hará que nuestro código sea más portable para utilizar en otros compiladores.

#int_EXT

void EXT_isr(void)

{

//pon aquí el código de la interruptor

}

Esta parte como ya sabéis nos la crea el asistente e incluye la función de interrupción, donde tendremos que incluir el código que queremos que se ejecute, cuando se active la interrupción externa por la patilla RB0. En nuestro caso lo que hace es comprobar si el interruptor de desactivación está abierto, si es así, activará la alarma conectada a RB7. Y permanecerá en un bucle infinito hasta que la desactivemos por medio del interruptor.

Si el interruptor está cerrado y pulsamos el sensor de alarma la interrupción se producirá igualmente, pero al no cumplirse la condición del if no ejecutará ninguna sentencia.

Dentro del bloque principal main, tenemos las sentencias que habilitan las interrupciones globales y la particular a RB0.

enable_interrupts(GLOBAL);

globalenable_interrupts(INT_EXT);

Nota: Por defecto la activación de la interrupción se produce en el flanco de subida, si queremos que sea en el flanco descendente podemos hacerlo por medio de la función:

ext_int_edge(flanco)

Ejemplo:

ext_int_edge(L_TO_H); --> flanco de subida.

ext_int_edge(H_TO_L); --> flanco de bajada.

Si no queremos utilizar las funciones de CCS. Podemos modificar directamente el bit INTEDG

Ejemplo:

#bit INTEDG=0x81.6

INTEDG=1; //flanco ascendente

INTEDG=0;//flanco descendente

Para ver como realmente CCS maneja estos registros lo podemos ver si ejecutamos el programa paso a paso en Proteus, si paramos la simulación en el bucle while de la función principal obtendremos lo que se muestra en la figura de abajo. Donde se puede ver el estado de los bits de configuración:

  • INTEDG=1 (Flanco de activación ascendente, el que tiene por defecto)

  • GIE= 1 (Permitidas las interrupciones globales)

  • INTE=1 (Permiso de activación interrupción RB0/INT)

  • INTF=0 (Señalización de interrupción)

Si ponemos un Breakpoint en el if que hay dentro de la rutina de interrupción y pulsamos el sensor de alarma para activar la interrupción los valores de los bits serán estos:

  • INTEDG=1 (Flanco de activación ascendente, el que tiene por defecto)

  • GIE= 0 (No permite otra interrupción mientras no se salga de esta)

  • INTE=1 (Permiso de activación interrupción RB0/INT, da igual que este a 1 por que la global está a 0)

  • INTF= 1(Señalización de interrupción)

Al salir de la interrupción los bits de configuración vuelven a quedar como al principio, a la espera de que se vuelva a producir otra interrupción.

El bit de señalización INTF no lo hemos usado en este ejemplo, pero en cualquier otro ejemplo podremos leer su valor y utilizarlo para lo que queramos.

Un saludo