Módulo Interrupción Este módulo genera las funciones necesarias para trabajar con interrupciones. #include <interrupt.h> _ISR_MAIN _ISR_MAIN Define la función interrupción principal, esta función se ejecutará cuando acurra cualquier interrupción. Puede escoger cualquier nombre para la función interrupción principal.se utiliza: #include <interrupt.h> _ISR_MAIN void nombre_de_la_funcion(void); //Esta función se ejecutará cuando ocurra cualquier interrupción. //Dentro de su código se deberá verivicar los FLAG, para saber //que interrupción ocurrió. void nombre_de_la_funcion(void) { //código genérico //cuando termines debes limpiar el FLAG de la interrupción que usaste } int main(void) { //En la función principal se deberá habilitar la interrupción GLOBAL } ISR_MAIN ISR_MAIN Define la función/código interrupción principal, esta función/código se ejecutará cuando acurra cualquier interrupción. Puede escoger cualquier nombre para la función/código interrupción principal. se utiliza: #include <interrupt.h> //Esta función/código se ejecutará cuando acurra cualquier interrupción. //Dentro de su código se deberá verivicar los FLAG, para saber //que interrupción ocurrió. ISR_MAIN(nombre_de_la_funcion) { //código genérico //cuando termines debes limpiar el FLAG de la interrupción que usaste } int main(void) { //En la función principal se deberá habilitar la interrupción GLOBAL } enable_int_global Habilita globalmente todas las interrupciones. void enable_int_global(void); ejemplo: enable_int_global(); disable_int_global Deshabilita globalmente todas las interrupciones. void disable_int_global(void); ejemplo: disable_int_global(); Interrupción Externa Las funciones para trabajar con la interrupción externa (RB0) son: enable_int_ext Habilita la interrupción externa #define H_TO_L 0 #define L_TO_H 1 void enable_int_ext(BYTE flanco); ejemplo: enable_int_global(L_TO_H); H_TO_L indica una interrupción activada por el flanco de bajada L_TO_H indica una interrupción activada por el flanco de subida disable_int_ext Deshabilita la interrupción externa void disable_int_ext(void); Al deshabilitar la interrupción no modifica el habilitador de interrupción global int_ext_flag Devuelve el estado actual del flag indicador de interrupción externa BYTE int_ext_flag(void); El uso de esta función no modifica el flag int_ext_free_flag Limpia el flag indicador de interrupción externa void int_ext_free_flag(void); El uso de esta función modifica el flag, poniendolo a 0 Interrupción TIMER0 Las funciones para trabajar con la interrupción por desbordamiento del TIMER0 son: enable_int_timer0 Habilita la interrupcion por desbordamiento del TIMER0 void enable_int_timer0(void); Para que esta interrupción se habilite tambien deberá activarse la interrupción global disable_int_timer0 Deshabilita la interrupción por desbordamiento del TIMER0 void disable_int_timer0(void); Al deshabilitar la interrupción no modifica el habilitador de interrupción global int_timer0_flag Devuelve el estado actual del flag indicador de interrupción por desbordamiento de TIMER0 BYTE int_timer0_flag(void); El uso de esta función no modifica el flag int_timer0_free_flag Limpia el flag indicador de interrupción por desbordamiento del TIMER0 void int_timer0_free_flag(void); El uso de esta función modifica el flag, poniendolo a 0 Interrupción RB4 to RB7 Las funciones para trabajar con la interrupción por cambio de estado de los pines RB4 a RB7 son: enable_int_rb4to7 Habilita la interrupcion por cambio de estado de los pines de Rb4 a RB7 void enable_int_rb4to7(void); Para que esta interrupción se habilite tambien deberá activarse la interrupción global disable_int_rb4to7 Deshabilita la interrupción por cambio de estado de los pines de RB4 a RB7 void disable_int_rb4to7(void); Al deshabilitar la interrupción no modifica el habilitador de interrupción global int_rb4to7_flag Devuelve el estado actual del flag indicador de interrupción por cambio de estado de los pines de RB4 a RB7 BYTE int_rb4to7_flag(void); El uso de esta función no modifica el flag int_rb4to7_free_flag Limpia el flag indicador de interrupción por cambio de estado de los pines de RB4 a RB7 void int_rb4to7_free_flag(void); El uso de esta función modifica el flag, poniendolo a 0 Interrupción Rx UART Las funciones para trabajar con la interrupción por recepcion de caracter en el UART son: enable_int_uart Habilita la interrupción por recepcion de caracter en el UART void enable_int_uart(void); Para que esta interrupción se habilite tambien deberá activarse la interrupción global disable_int_uart Deshabilita la interrupción por recepcion de caracter en el UART void disable_int_uart(void); Al deshabilitar la interrupción no modifica el habilitador de interrupción global int_uart_flag Devuelve el estado actual del flag indicador de interrupción por recepcion de caracter en el UART BYTE int_uart_flag(void); El uso de esta función no modifica el flag, es mas no puede. int_uart_free_flag esta función no existe El flag no se limpiará hasta leer con la función uart_getc el caracter entrante, esta función tiene que colocarse dentro de la función interrupción pues de lo contrario el flag nunca se limpiará y nunca saldras de la función interrupción, pues esta se invocará hasta el fin de los tiempos. Interrupción ADC Las funciones para trabajar con la interrupción por finalización de la conversión analógica a digital son: enable_int_adc Habilita la interrupción por finalización de la conversión analogica a digital void enable_int_adc(void); Para que esta interrupción se habilite tambien deberá activarse la interrupción global disable_int_adc Deshabilita la interrupción por finalizacion de la conversión analógica a digital void disable_int_adc(void); Al deshabilitar la interrupción no modifica el habilitador de interrupción global int_adc_flag Devuelve el estado actual del flag indicador de interrupción por rfinalización de la conversión analógica a digital BYTE int_adc_flag(void); El uso de esta función no modifica el flag. Interrupción Comparador Las funciones para trabajar con la interrupción por finalización de comparación son: enable_int_comp Habilita la interrupción por finalización de la comparación void enable_int_comp(void); Para que esta interrupción se habilite tambien deberá activarse la interrupción global disable_int_comp Deshabilita la interrupción por finalización de la comparación void disable_int_comp(void); Al deshabilitar la interrupción no modifica el habilitador de interrupción global int_comp_flag Devuelve el estado actual del flag indicador de interrupción por r finalización de la comparación BYTE int_comp_flag(void); El uso de esta función no modifica el flag. Ejemplo de Módulo Interrupcion Externa Para compilar necesitas los siguientes comandos Ejemplo de compilacion : ./compila.sh ej_intext 16f877a ej_intext.c #include <pic/p16f877a.h> #define FOSC_HZ 20000000 #include <pinio.h> #include <delayms.h> #include <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; }