	<sect1 id="interrupt" xreflabel="interrupt">
		<title>M&oacute;dulo Interrupci&oacute;n</title>
		<para> Este m&oacute;dulo genera las funciones necesarias para trabajar con interrupciones.</para>

		<para>
		<screen>
	#include &lt;interrupt.h>
		</screen>
		</para>

		<sect2 id="isrmain" xreflabel="_ISR_MAIN">
		<title>_ISR_MAIN</title>
		<para> 
			_ISR_MAIN Define la funci&oacute;n interrupci&oacute;n principal, esta funci&oacute;n se ejecutar&aacute; cuando acurra cualquier interrupci&oacute;n.
		</para>
		<para>
			Puede escoger cualquier nombre para la funci&oacute;n interrupci&oacute;n principal.se utiliza: </para>
		<screen>
	#include &lt;interrupt.h>

	_ISR_MAIN void nombre_de_la_funcion(void);

	//Esta funci&oacute;n se ejecutar&aacute; cuando ocurra cualquier interrupci&oacute;n.
	//Dentro de su c&oacute;digo se deber&aacute; verivicar los FLAG, para saber 
	//que interrupci&oacute;n ocurri&oacute;.
	void nombre_de_la_funcion(void)
	{ 
		//c&oacute;digo gen&eacute;rico
		//cuando termines debes limpiar el FLAG de la interrupci&oacute;n que usaste
	}

	int main(void)
	{ 
		//En la funci&oacute;n principal se deber&aacute; habilitar la interrupci&oacute;n GLOBAL
	}
		</screen>
		</sect2>

		<sect2 id="isrmain1" xreflabel="ISR_MAIN">
		<title>ISR_MAIN</title>
		<para> 
			ISR_MAIN Define la funci&oacute;n/c&oacute;digo interrupci&oacute;n principal, esta funci&oacute;n/c&oacute;digo se ejecutar&aacute; cuando acurra cualquier interrupci&oacute;n.
		</para>
		<para>
			Puede escoger cualquier nombre para la funci&oacute;n/c&oacute;digo interrupci&oacute;n principal. se utiliza: </para>
		<screen>
	#include &lt;interrupt.h>

	//Esta funci&oacute;n/c&oacute;digo se ejecutar&aacute; cuando acurra cualquier interrupci&oacute;n.
	//Dentro de su c&oacute;digo se deber&aacute; verivicar los FLAG, para saber 
	//que interrupci&oacute;n ocurri&oacute;.
	ISR_MAIN(nombre_de_la_funcion)
	{ 
		//c&oacute;digo gen&eacute;rico
		//cuando termines debes limpiar el FLAG de la interrupci&oacute;n que usaste
	}
	
	int main(void)
	{ 
		//En la funci&oacute;n principal se deber&aacute; habilitar la interrupci&oacute;n GLOBAL
	}
		</screen>
		</sect2>

		<sect2 id="enableintglobal" xreflabel="enable_int_global">
		<title>enable_int_global</title>
		<para> Habilita globalmente todas las interrupciones. </para>
		<screen>
	void enable_int_global(void);

	ejemplo:
	enable_int_global();
		</screen>
		</sect2>

		<sect2 id="disableintglobal" xreflabel="disable_int_global">
		<title>disable_int_global</title>
		<para> Deshabilita globalmente todas las interrupciones. </para>
		<screen>
	void disable_int_global(void);

	ejemplo:
	disable_int_global();
		</screen>
		</sect2>

		<sect2 id="intexterna" xreflabel="interrupcion externa">
		<title>Interrupci&oacute;n Externa</title>
		<para> Las funciones para trabajar con la interrupci&oacute;n externa (RB0) son:</para>
		<sect3 id="enableintext" xreflabel="enable_int_ext">
		<title>enable_int_ext</title>
		<para>Habilita la interrupci&oacute;n externa</para>
		<screen>
	#define  H_TO_L    0
	#define  L_TO_H    1

	void	enable_int_ext(BYTE flanco);

	ejemplo:
	enable_int_global(L_TO_H);
		</screen>
		<para>H_TO_L indica una interrupci&oacute;n activada por el flanco de bajada</para>
		<para>L_TO_H indica una interrupci&oacute;n activada por el flanco de subida</para>
		</sect3>
		<sect3 id="disableintext" xreflabel="disable_int_ext">
		<title>disable_int_ext</title>
		<para>Deshabilita la interrupci&oacute;n externa</para>
		<screen>
	void	disable_int_ext(void);
		</screen>
		<para>Al deshabilitar la interrupci&oacute;n no modifica el habilitador de interrupci&oacute;n global</para>
		</sect3>
		<sect3 id="intextflag" xreflabel="int_ext_flag">
		<title>int_ext_flag</title>
		<para>Devuelve el estado actual del flag indicador de interrupci&oacute;n externa</para>
		<screen>
	BYTE	int_ext_flag(void);
		</screen>
		<para>El uso de esta funci&oacute;n no modifica el flag</para>
		</sect3>
		<sect3 id="intextfreeflag" xreflabel="int_ext_free_flag">
		<title>int_ext_free_flag</title>
		<para>Limpia el flag indicador de interrupci&oacute;n externa</para>
		<screen>
	void	int_ext_free_flag(void);
		</screen>
		<para>El uso de esta funci&oacute;n modifica el flag, poniendolo a 0</para>
		</sect3>
		</sect2>

		<sect2 id="inttimer0" xreflabel="interrupcion TIMER0">
		<title>Interrupci&oacute;n TIMER0</title>
		<para> Las funciones para trabajar con la interrupci&oacute;n por desbordamiento del TIMER0 son:</para>
		<sect3 id="enableinttimer0" xreflabel="enable_int_timer0">
		<title>enable_int_timer0</title>
		<para>Habilita la interrupcion por desbordamiento del TIMER0</para>
		<screen>
	void	enable_int_timer0(void);
		</screen>
		<para>Para que esta interrupci&oacute;n se habilite tambien deber&aacute; activarse la interrupci&oacute;n global</para>
		</sect3>
		<sect3 id="disableinttimer0" xreflabel="disable_int_timer0">
		<title>disable_int_timer0</title>
		<para>Deshabilita la interrupci&oacute;n por desbordamiento del TIMER0</para>
		<screen>
	void	disable_int_timer0(void);
		</screen>
		<para>Al deshabilitar la interrupci&oacute;n no modifica el habilitador de interrupci&oacute;n global</para>
		</sect3>
		<sect3 id="inttimer0flag" xreflabel="int_timer0_flag">
		<title>int_timer0_flag</title>
		<para>Devuelve el estado actual del flag indicador de interrupci&oacute;n por desbordamiento de TIMER0</para>
		<screen>
	BYTE	int_timer0_flag(void);
		</screen>
		<para>El uso de esta funci&oacute;n no modifica el flag</para>
		</sect3>
		<sect3 id="inttimer0freeflag" xreflabel="int_timer0_free_flag">
		<title>int_timer0_free_flag</title>
		<para>Limpia el flag indicador de interrupci&oacute;n por desbordamiento del TIMER0</para>
		<screen>
	void	int_timer0_free_flag(void);
		</screen>
		<para>El uso de esta funci&oacute;n modifica el flag, poniendolo a 0</para>
		</sect3>
		</sect2>

		<sect2 id="intrb4to7" xreflabel="interrupcion RB4 to RB7">
		<title>Interrupci&oacute;n RB4 to RB7</title>
		<para> Las funciones para trabajar con la interrupci&oacute;n por cambio de estado de los pines RB4 a RB7 son:</para>
		<sect3 id="enableintrb4to7" xreflabel="enable_int_rb4to7">
		<title>enable_int_rb4to7</title>
		<para>Habilita la interrupcion por cambio de estado de los pines de Rb4 a RB7</para>
		<screen>
	void	enable_int_rb4to7(void);
		</screen>
		<para>Para que esta interrupci&oacute;n se habilite tambien deber&aacute; activarse la interrupci&oacute;n global</para>
		</sect3>
		<sect3 id="disableintrb4to7" xreflabel="disable_int_rb4to7">
		<title>disable_int_rb4to7</title>
		<para>Deshabilita la interrupci&oacute;n por cambio de estado de los pines de RB4 a RB7</para>
		<screen>
	void	disable_int_rb4to7(void);
		</screen>
		<para>Al deshabilitar la interrupci&oacute;n no modifica el habilitador de interrupci&oacute;n global</para>
		</sect3>
		<sect3 id="intrb4to7flag" xreflabel="int_rb4to7_flag">
		<title>int_rb4to7_flag</title>
		<para>Devuelve el estado actual del flag indicador de interrupci&oacute;n por cambio de estado de los pines de RB4 a RB7</para>
		<screen>
	BYTE	int_rb4to7_flag(void);
		</screen>
		<para>El uso de esta funci&oacute;n no modifica el flag</para>
		</sect3>
		<sect3 id="intrb4to7freeflag" xreflabel="int_rb4to7_free_flag">
		<title>int_rb4to7_free_flag</title>
		<para>Limpia el flag indicador de interrupci&oacute;n por cambio de estado de los pines de RB4 a RB7</para>
		<screen>
	void	int_rb4to7_free_flag(void);
		</screen>
		<para>El uso de esta funci&oacute;n modifica el flag, poniendolo a 0</para>
		</sect3>
		</sect2>

		<sect2 id="intuart" xreflabel="interrupcion Rx UART">
		<title>Interrupci&oacute;n Rx UART</title>
		<para> Las funciones para trabajar con la interrupci&oacute;n por recepcion de caracter en el UART son:</para>
		<sect3 id="enableintuart" xreflabel="enable_int_uart">
		<title>enable_int_uart</title>
		<para>Habilita la interrupci&oacute;n por recepcion de caracter en el UART</para>
		<screen>
	void	enable_int_uart(void);
		</screen>
		<para>Para que esta interrupci&oacute;n se habilite tambien deber&aacute; activarse la interrupci&oacute;n global</para>
		</sect3>
		<sect3 id="disableintuart" xreflabel="disable_int_uart">
		<title>disable_int_uart</title>
		<para>Deshabilita la interrupci&oacute;n por recepcion de caracter en el UART</para>
		<screen>
	void	disable_int_uart(void);
		</screen>
		<para>Al deshabilitar la interrupci&oacute;n no modifica el habilitador de interrupci&oacute;n global</para>
		</sect3>
		<sect3 id="intuartflag" xreflabel="int_uart_flag">
		<title>int_uart_flag</title>
		<para>Devuelve el estado actual del flag indicador de interrupci&oacute;n por recepcion de caracter en el UART</para>
		<screen>
	BYTE	int_uart_flag(void);
		</screen>
		<para>El uso de esta funci&oacute;n no modifica el flag, es mas no puede.</para>
		</sect3>
		<sect3 id="intuartfreeflag" xreflabel="int_uart_free_flag">
		<title>int_uart_free_flag</title>
		<para>esta funci&oacute;n no existe</para>
		<para>El flag no se limpiar&aacute; hasta leer con la funci&oacute;n uart_getc el caracter entrante, esta funci&oacute;n tiene que colocarse dentro de la funci&oacute;n interrupci&oacute;n pues de lo contrario el flag nunca se limpiar&aacute; y nunca saldras de la funci&oacute;n interrupci&oacute;n, pues esta se invocar&aacute; hasta el fin de los tiempos.</para>
		</sect3>
		</sect2>

		<sect2 id="intadc" xreflabel="interrupcion ADC">
		<title>Interrupci&oacute;n ADC</title>
		<para> Las funciones para trabajar con la interrupci&oacute;n por finalizaci&oacute;n de la conversi&oacute;n anal&oacute;gica a digital son:</para>
		<sect3 id="enableintadc" xreflabel="enable_int_adc">
		<title>enable_int_adc</title>
		<para>Habilita la interrupci&oacute;n por finalizaci&oacute;n de la conversi&oacute;n analogica a digital</para>
		<screen>
	void	enable_int_adc(void);
		</screen>
		<para>Para que esta interrupci&oacute;n se habilite tambien deber&aacute; activarse la interrupci&oacute;n global</para>
		</sect3>
		<sect3 id="disableintadc" xreflabel="disable_int_adc">
		<title>disable_int_adc</title>
		<para>Deshabilita la interrupci&oacute;n por finalizacion de la conversi&oacute;n anal&oacute;gica a digital</para>
		<screen>
	void	disable_int_adc(void);
		</screen>
		<para>Al deshabilitar la interrupci&oacute;n no modifica el habilitador de interrupci&oacute;n global</para>
		</sect3>
		<sect3 id="intadcflag" xreflabel="int_adc_flag">
		<title>int_adc_flag</title>
		<para>Devuelve el estado actual del flag indicador de interrupci&oacute;n por rfinalizaci&oacute;n de la conversi&oacute;n anal&oacute;gica a digital</para>
		<screen>
	BYTE	int_adc_flag(void);
		</screen>
		<para>El uso de esta funci&oacute;n no modifica el flag.</para>
		</sect3>
		</sect2>

		<sect2 id="intcomp" xreflabel="interrupcion COMPARADOR">
		<title>Interrupci&oacute;n Comparador</title>
		<para> Las funciones para trabajar con la interrupci&oacute;n por finalizaci&oacute;n de comparaci&oacute;n son:</para>
		<sect3 id="enableintcomp" xreflabel="enable_int_comp">
		<title>enable_int_comp</title>
		<para>Habilita la interrupci&oacute;n por finalizaci&oacute;n de la comparaci&oacute;n</para>
		<screen>
	void	enable_int_comp(void);
		</screen>
		<para>Para que esta interrupci&oacute;n se habilite tambien deber&aacute; activarse la interrupci&oacute;n global</para>
		</sect3>
		<sect3 id="disableintcomp" xreflabel="disable_int_comp">
		<title>disable_int_comp</title>
		<para>Deshabilita la interrupci&oacute;n por finalizaci&oacute;n de la comparaci&oacute;n</para>
		<screen>
	void	disable_int_comp(void);
		</screen>
		<para>Al deshabilitar la interrupci&oacute;n no modifica el habilitador de interrupci&oacute;n global</para>
		</sect3>
		<sect3 id="intcompflag" xreflabel="int_comp_flag">
		<title>int_comp_flag</title>
		<para>Devuelve el estado actual del flag indicador de interrupci&oacute;n por r finalizaci&oacute;n de la comparaci&oacute;n</para>
		<screen>
	BYTE	int_comp_flag(void);
		</screen>
		<para>El uso de esta funci&oacute;n no modifica el flag.</para>
		</sect3>
		</sect2>

		<sect2 id="ejemplomodulointext" xreflabel="Ejemplo_Modulo_int_ext">
		<title>Ejemplo de M&oacute;dulo Interrupcion Externa</title>
		<para> Para compilar necesitas los siguientes comandos </para>
		<para>
		<screen>
Ejemplo de compilacion : ./compila.sh ej_intext 16f877a
		</screen>
		</para>
		<para> ej_intext.c </para>

		<screen>
	#include &lt;pic/p16f877a.h>

	#define FOSC_HZ 20000000

	#include &lt;pinio.h>
	#include &lt;delayms.h>
	#include &lt;interrupt.h>

	BYTE bandera=0;

	void funcion_con_mucho_codigo(void)
	{
		//codigo
		bandera=0;
	}

	ISR_MAIN(funcion_interrupcion_global)
	{ 
		if(int_ext_flag()==TRUE)
		{
			bandera=1;
			int_ext_free_flag();
		}
	}

	int main (void)
	{
		delayms(100);
	
		enable_int_ext(L_TO_H);
		enable_int_global();

		set_pullup_portb(TRUE);

		while(TRUE)
		{
			if(bandera==1) funcion_con_mucho_codigo();
		}

		disable_int_ext();
		return 0;
	}
		</screen>
		</sect2>		
		
	</sect1>
