



Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity
Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium
Prepara tus exámenes
Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity
Prepara tus exámenes con los documentos que comparten otros estudiantes como tú en Docsity
Encuentra los documentos específicos para los exámenes de tu universidad
Estudia con lecciones y exámenes resueltos basados en los programas académicos de las mejores universidades
Responde a preguntas de exámenes reales y pon a prueba tu preparación
Consigue puntos base para descargar
Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium
Comunidad
Pide ayuda a la comunidad y resuelve tus dudas de estudio
Ebooks gratuitos
Descarga nuestras guías gratuitas sobre técnicas de estudio, métodos para controlar la ansiedad y consejos para la tesis preparadas por los tutores de Docsity
se explica la interrupción externa para un pic 18f45k22
Tipo: Apuntes
1 / 6
Esta página no es visible en la vista previa
¡No te pierdas las partes importantes!




Interrupción externa en microcontroladores pic Los dispositivos PIC18 tienen múltiples fuentes de interrupción y una función de prioridad de interrupción que permite asignar a las fuentes de interrupción más frecuentes un nivel de prioridad alto o bajo (INT0 no tiene un bit de prioridad, siempre es de alta prioridad). El vector de interrupción de alta prioridad está a 0008h y el vector de interrupción de baja prioridad está a 0018h. Un evento de interrupción de alta prioridad interrumpirá una interrupción de baja prioridad que pueda estar en curso. Hay 19 registros utilizados para controlar el funcionamiento de la interrupción. Estos registros son:
GIE/GIEH y PEIE/GIEL del modo de compatibilidad son reemplazados por la alta prioridad GIEH, y la baja prioridad GIEL, habilita la interrupción global. Cuando se establece, el bit GIEH del registro INTCON habilita todas las interrupciones que tienen su registro IPRx asociado o el bit de prioridad del registro INTCONx establecido (alta prioridad). Cuando está desactivado, el bit GIEH desactiva todas las fuentes de interrupción, incluidas las seleccionadas como de baja prioridad. Cuando está despejado, el bit GIEL del registro INTCON desactiva sólo las interrupciones que tienen su bit de prioridad asociado despejado (prioridad baja). Cuando está activado, el bit GIEL habilita las fuentes de baja prioridad cuando el bit GIEH también está activado. Cuando el indicador de interrupción, habilite el bit y el apropiado Los bits de la Habilitación de Interrupción Global (GIE) están listos, el La interrupción se dirigirá inmediatamente a la dirección 0008h para alta prioridad, o 0018h para la baja prioridad, dependiendo de el nivel del bit de prioridad de la fuente de interrupción. Individual las interrupciones pueden ser desactivadas a través de sus correspondientes interrumpir habilitar bits. Respuesta de interrupción Cuando se responde a una interrupción, el bit de Habilitación de Interrupción Global se despeja para deshabilitar más interrupciones. El bit GIE/GIEH es la Habilitación de Interrupción Global cuando el bit IPEN se borra. Cuando el bit IPEN está activado, habilitando los niveles de prioridad de interrupción, el bit GIEH es la habilitación de interrupción global de alta prioridad y el bit GIEL es la habilitación de interrupción global de baja prioridad. Las fuentes de interrupción de alta prioridad pueden interrumpir una interrupción de baja prioridad. Las interrupciones de baja prioridad no se procesan mientras las de alta prioridad están en curso. La dirección de retorno se empuja en la pila y el PC se carga con la dirección del vector de la interrupción (0008h o 0018h). Una vez en la Rutina de Servicio de Interrupción, la(s) fuente(s) de la interrupción puede(n) ser determinada(s) mediante el sondeo de los bits de bandera de interrupción en los registros INTCONx y PIRx. Los bits de bandera de interrupción deben ser borrados por el software antes de volver a habilitar las interrupciones para evitar que se repita la misma interrupción. La instrucción "return from interrupt", RETFIE, sale de la rutina de interrupción y establece el bit GIE/GIEH (GIEH o GIEL si se utilizan niveles de prioridad), que vuelve a habilitar las interrupciones. Para los eventos de interrupción externos, como los pines INT o la interrupción-en-cambio PORTB, la latencia de la interrupción será de tres a cuatro ciclos de instrucción. La latencia exacta es la misma para las instrucciones de uno o dos ciclos. Se establecen bits de marca de interrupción individuales, independientemente del estado de sus correspondientes bits de habilitación o del bit de habilitación de interrupción global.
Para usar las interrupciones de forma fácil hay que poner en 0 el bit IPEN para no tener prioridades de interrupción.
Luego se tiene que habilitar el bit GIE para habilitar la interrupción globales. INTxIE es el bit que hablita la interrupción externa INTxIF es le bit de la bandera de la interrupción INTEDGx Es el bit que indica si la interrupción es por flanco de subida o de bajada Cuando se esta trabajando con prioridades también es necesario colocar el bit de prioridad a las interrupciones este es el INT2IP Un ejemplo de las interrupciones externas: void main(void) { //CONFIGURACION BASAICA DE PUERTOS TRISA=0x00; TRISB=0xff; ANSELA=0x00; ANSELB=0x00; LATA=0x00; RCONbits.IPEN=0;//DESABILITA LAS PRIORIDADES DE INTERRUPCION INTCONbits.GIE=1;//HABILITA LAS INTERRUPCIONES GLOBALES INTCONbits.INT0F=0;//LIMPIA LA BANDERA DE LA INTERRUPCION EXTERNA INTCON3bits.INT1F=0; INTCON3bits.INT2F=0; INTCONbits.INT0E=1;//HABILITA LA INTERRUPCION EXTERNA INTCON3bits.INT1E=1; INTCON3bits.INT2E=1; INTCON2bits.INTEDG0=0;//LA INTERRUPCION EXTERNA SE COLOCA COMO FLANCO DE BAJADA INTCON2bits.INTEDG1=0; INTCON2bits.INTEDG2=0; while(1); } void __interrupt() isr(void) { if(INTCONbits.INT0F==1) { LATAbits.LA0=~LATAbits.LA0; INTCONbits.INT0F=0; } if(INTCON3bits.INT1F==1) { LATAbits.LA1=~LATAbits.LA1; INTCON3bits.INT1F=0; } if(INTCON3bits.INT2F==1) { LATAbits.LA2=~LATAbits.LA2; INTCON3bits.INT2F=0; }