Bienvenidos Controleros y Controleras, en esta entrada vamos a aprender a usar las interrupciones con PIC para desarrollar diferentes proyectos. Veremos algunos ejemplos como la detección de Interrupción Externa con PIC.
Antes de comenzar te hago la invitación para que veas todo nuestro Curso gratuito de microcontroladores PIC
Y que te suscribas al canal si te gusta la programación de microcontroladores y la teoría de control.
Interrupciones PIC
Con las interrupciones en un microcontrolador vamos a poder hacer que el dispositivo pare de repente la tarea que está realizando para que haga o realice una función con urgencia y después continúe haciendo su rutina habitual.
Por ejemplo. cuando hacemos el llamado de funciones desde el main, lo que se hace es que el programa ejecute un subprograma y luego regrese al programa principal, sin embargo el programador esta definiendo en que momento debe saltar a ejecutar la función mediante las instrucciones, por esta razón se considera sincronas.
Las interrupciones PIC son desviaciones de flujo de control del programa originadas asincrónicamente por diversos sucesos que no dependen del programador, es decir, ocurren en cualquier momento.
Las interrupciones PIC ocurren por sucesos externos como la generación de una interrupción por flanco PIC, una interrupción externa PIC cambiando el nivel en un PIN del microcontrolador o eventos internos tales como el desbordamiento de un contador, terminación del conversor análogo a digital, entre otras.
El comportamiento del microcontrolador ante la interrupción es similar al procedimiento que se sigue al llamar una función desde el programa principal. En ambos casos se detiene la ejecución del programa en curso, se guarda la dirección a donde debe retornar cuando termine de ejecutar la interrupción, atiende o ejecuta el programa correspondiente a la interrupción y luego continua ejecutando el programa principal, desde donde lo dejo cuando fue interrumpido.
Tipos de Interrupciones PIC
Aqui nombramos 10 diferentes causas que producen una interrupción PIC, por lo tanto el primer paso de la rutina de interrupción será identificar la causa de la interrupción.
- Interrupción externa PIC RB0/INT
- Interrupción por cambio lógico en el puerto B (pines RB7 a RB4)
- Interrupción por desborde del timer 0 (TMR0)
- Interrupción por desborde del timer 1 (TMR1)
- Interrupción por comparación exitosa exitosa en TMR2
- Interrupción del comparador
- Interrupción del transmisor del USART
- Interrupción del receptor del USART
- Interrupción del módulo CCP
- Interrupción del EEPROM
Interrupciones PIC en CCS
Vamos a ver como podemos utilizar las interrupciones en un PIC utilizando el PIC C Compiler CCS. Lo que veremos aqui puedes aplicarlo en cualquier microcontrolador de Microchip, por ejemplo esto sirve para las interrupciones PIC 18F4550 CCS, Interrupciones PIC 16F877A, Interrupciones PIC 16F84 o cualquier otro. A modo de ejemplo lo mostraremos como usar las interrupciones PIC en el 18F887.
Los pasos que se deben seguir para atender una interrupción, son los siguientes
- Digitar la función correspondiente a la interrupción. La función debe comenzar con # y la interrupción correspondiente, por ejemplo para la función de interrupción por RB0 se digita #int_EXT
- En el programa principal, habilitar las interrupciones en forma global, con la instrucción: enable_interrupts(GLOBAL);
- En el programa principal, habilitar la interrupción correspondiente, como ejemplo se muestra como habilitar la interrupción externa por RB0: enable_interrupts(INT_EXT);
Existen diferentes tipos de interrupción en el microcontrolador, algunas de ellas se mencionan a continuación:
#INT_EXT INTERRUPCIÓN EXTERNA
#INT_RTCC DESBORDAMIENTO DEL TIMER0(RTCC)
#INT_RB CAMBIO EN UNO DE LOS PINES B4,B5,B6,B7
#INT_AD CONVERSOR A/D
#INT_EEPROM ESCRITURA EN LA EEPROM COMPLETADA
#INT_TIMER1 DESBORDAMIENTO DEL TIMER1
#INT_TIMER2 DESBORDAMIENTO DEL TIMER2
Aqui de dejo un Documento con todas las interrupciones del PIC usando PIC C Compiler 👉 Interrupciones PIC
Interrupción Externa PIC 16F887 – PIC 16F877A – PIC 18F4550
Hacer un programa que me incremente un contador de 0 a 9, cuando ocurra una interrupción externa por RB0. Cuando el contador llegue a 9, comienza de nuevo en cero. (El código de implementación se encuentra al final del post)
Vemos el video donde el código de implementación de la interrupcion externa PIC 16F887, sin embargo el código sirve para la interrupcion PIC 18F4550, el PIC 16F877A o cualquier otro PIC.
KIT para PIC BARATOS
A continuación te dejo algunas placas de desarrollo BARATAS y Motores DC con el ENCODER ya incluido para que puedas aprender más facilmente sobre los microcontroladores PIC y los puedas adquirir desde cualquier parte del MUNDO, a través del sitio web chino de Aliexpress.
Es importante destacar que para la construcción de nuestros proyectos electrónicos con microcontroladores podemos comprarlos también desde la comodidad de nuestra casa en Amazon que tiene envios para cualquier lugar de latinoamerica y para europa:
Código de Implementación:
A continuación se presenta el Código de Implementación de los dos ejemplos de vistos en esta entrada con relación a las interrupciones externas por RB0. Recuerda que para ver el código, solo basta con compartir la información de este post con alguno de los siguientes tres botones.
Código – Interrución Externa CCS
Pueden descargar el código y el diseño en proteus aqui:
#INCLUDE <16F887.H> #FUSES XT,NOLVP,NOWDT,PUT //#USE DELAY(CLOCK=4000000) //Cystal interno 4MHz #use delay(clock=4000000,crystal)//Crystal Externo 4MHz Byte CONST display[10]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67}; #BYTE PORTC = 7 #BYTE PORTB = 6 INT CONT=0; #INT_EXT //Funcion de la Interrupcion VOID INTERRUPCION() { DELAY_MS(200); //Retardo CONT++; //Incremente la variable CONT IF(CONT==10) //Si la variable CONT es igual a 10 CONT=0; //Ponga en cero la variable CONT } VOID MAIN() { SET_TRIS_B(0B11111111); //Configurar el puerto B SET_TRIS_C(0); //Configurar el puerto C ENABLE_INTERRUPTS(GLOBAL); //Habilita todas las interrupciones ENABLE_INTERRUPTS(INT_EXT); //Habilita la interrupción externa WHILE(TRUE) { PORTC= (display[CONT]); //Muestra lo que hay en la variable CONT en el display } }
Si desean utilizar la interrupción externa PIC 18F4550 o cualquier otro de la familia 18, debes cambiar el encabezado por:
#include <18f4550.h> #byte porta = 0xf80 // Identificador para el puerto A. #byte portb = 0xf81 // Identificador para el puerto B. #byte portc = 0xf82 // Identificador para el puerto C. #byte portd = 0xf83 // Identificador para el puerto D. #byte porte = 0xf84 // Identificador para el puerto E.
Si desean utilizar la interrupción externa PIC 16F877A o cualquier otro de la familia 16, debes cambiar el encabezado por:
#include <16f877A.h>
Eso es todo por la entrada del dia de hoy, espero les haya gustado y hayan aprendido algo nuevo. Si te ha servido el contenido de esta entrada, de los videos y los códigos de implementación y deseas apoyar mi trabajo invitandome a un café super barato, puedes hacerlo en el siguiente link:
👉 Invitar a Sergio a un Café ☕️
Que esten muy bien, nos vemos en la siguiente entrada.
Mi nombre es Sergio Andres Castaño Giraldo, y en este sitio web voy a compartir una de las cosas que mas me gusta en la vida y es sobre la Ingeniería de Control y Automatización. El sitio web estará en constante crecimiento, voy a ir publicando material sobre el asunto desde temas básicos hasta temas un poco más complejos. Suscríbete al sitio web, dale me gusta a la página en Facebook y únete al canal de youtube. Espero de corazón que la información que comparto en este sitio, te pueda ser de utilidad. Y nuevamente te doy las gracias y la bienvenida a control automático educación.