Laboratorio 5 (Interrupciones)

10
UNIVERSIDAD NACIONAL DE INGENIERÍA FACULTAD DE ELECTROTECNIA Y COMPUTACIÓN ELECTRÓNICA DIGITAL II DEPARTAMENTO SISTEMAS DIGITALES Y TELECOMUNICACIONES Laboratorio 5: Interrupciones 1. Objetivos o Comprender el uso de las interrupciones con que dispone el microcontrolador. o Usar las interrupciones INT_RB e INT_EXT 2. Introducción Las interrupciones permiten a cualquier suceso interior o exterior al interrumpir la ejecución del programa principal (main) en cualquier momento. En el momento de producirse la interrupción, el PIC ejecuta un salto a la rutina de atención a la interrupción (ISR, Interrupt Service Routine), previamente definida, donde se atenderá a la demanda de la interrupción. Cuando se termina de ejecutar dicha rutina, el PIC retorna a la ejecución del programa principal en la misma posición de la memoria de programa donde se ejecutó la interrupción 1 . Mirar Figura 1. Figura 1. Flujo de una interrupción en la programación 2 El uso de las interrupciones es fundamental ya que el usuario no necesita consultar continuamente en el programa si ha ocurrido un suceso determinado, sino más bien deja estipulado qué función realizar en tal caso. 1 Compilador C CCS y Simulador Proteus para Microcontroladores PIC, Eduardo García Breijo, Alfaomega 2 http://www.puntoflotante.net/INTERRUPCIONES-18F2550-TIMER-0.htm

description

lab

Transcript of Laboratorio 5 (Interrupciones)

Page 1: Laboratorio 5 (Interrupciones)

UNIVERSIDAD NACIONAL DE INGENIERÍA

FACULTAD DE ELECTROTECNIA Y COMPUTACIÓN ELECTRÓNICA DIGITAL II

DEPARTAMENTO SISTEMAS DIGITALES Y TELECOMUNICACIONES

Laboratorio 5: Interrupciones

1. Objetivos

o Comprender el uso de las interrupciones con que dispone el microcontrolador.

o Usar las interrupciones INT_RB e INT_EXT

2. Introducción

Las interrupciones permiten a cualquier suceso interior o exterior al interrumpir la ejecución del programa principal (main) en cualquier momento. En el momento de producirse la interrupción, el PIC ejecuta un salto a la rutina de atención a la interrupción (ISR, Interrupt Service Routine), previamente definida, donde se atenderá a la demanda de la interrupción. Cuando se termina de ejecutar dicha rutina, el PIC retorna a la ejecución del programa principal en la misma posición de la memoria de programa donde se ejecutó la interrupción1. Mirar Figura 1.

Figura 1. Flujo de una interrupción en la programación2

El uso de las interrupciones es fundamental ya que el usuario no necesita consultar continuamente en el programa si ha ocurrido un suceso determinado, sino más bien deja estipulado qué función realizar en tal caso. 1 Compilador C CCS y Simulador Proteus para Microcontroladores PIC, Eduardo García Breijo, Alfaomega 2 http://www.puntoflotante.net/INTERRUPCIONES-18F2550-TIMER-0.htm

Page 2: Laboratorio 5 (Interrupciones)

UNIVERSIDAD NACIONAL DE INGENIERÍA

FACULTAD DE ELECTROTECNIA Y COMPUTACIÓN ELECTRÓNICA DIGITAL II

DEPARTAMENTO SISTEMAS DIGITALES Y TELECOMUNICACIONES

Cada microcontrolador varía en la cantidad de interrupciones que dispone. El 16F877A posee 15. Mirar Figura 2.

Figura 2. Cantidad de interrupciones de la familia 16F87XA.

Los registros que controlan las interrupciones están en la sección “Registros de Función Especial” (Special Function Registers, en inglés) del capítulo 2 “Organización de la Memoria de Datos” (Data Memory Organization, en inglés). Estos son:

· OPTION_REG· INTCON · PIE1 · PIR1 · PIE2 · PIR2

En la Figura 3 se muestran las interrupciones que el registro INTCON controla. Al configurar los bits de los registros, se habilita o deshabilita una o varias interrupciones. Al producirse una interrupción determinada, ésta afectará el bit de flag, en el registro correspondiente, para indicar que la interrupción ha ocurrido.

Page 3: Laboratorio 5 (Interrupciones)

UNIVERSIDAD NACIONAL DE INGENIERÍA

FACULTAD DE ELECTROTECNIA Y COMPUTACIÓN ELECTRÓNICA DIGITAL II

DEPARTAMENTO SISTEMAS DIGITALES Y TELECOMUNICACIONES

Figura 3. Interrupciones que controla el registro .

En este laboratorio se aprenderá a utilizar las interrupciones INT_EXT e INT_RB, las cuales responden a un cambio de nivel (de alto a bajo o de bajo a alto) en RB0 y un cambio de estado en los pines RB4 − RB7 del Puerto B, respectivamente.

3. Desarrollando el código Hardware: La sección 14.11, “Interrupts”, explica lo fundamental del manejo de las interrupciones. Indica que el Bit de Habilitación de Interrupción Global (Global Interrupt Enable Bit) GIE, ubicado en el Bit 7 del registro INTCON (INTCON < 7 >), habilita (si está a 1) todas las interrupciones o deshabilita (si está a 0) todas las interrupciones. Mirar Figura 4.

Figura 4. Eplicación del Global Interrupt Enable.

En la sección 14.11.1, “INT Interrupt”, se explica cómo funciona la interrupción externa en RB0. La interrupción externa es activada por flanco, puede ser por flanco

Page 4: Laboratorio 5 (Interrupciones)

UNIVERSIDAD NACIONAL DE INGENIERÍA

FACULTAD DE ELECTROTECNIA Y COMPUTACIÓN ELECTRÓNICA DIGITAL II

DEPARTAMENTO SISTEMAS DIGITALES Y TELECOMUNICACIONES

ascendente si el bit INTEDG (OPTION_REG < 6 >) está a 1, o por flanco descendente si el bit INTEDG está a 0. Cuando un flanco válido aparece en el pin RB0, su bit de bandera INTF(INTCON < 1 >) es puesto a 1, indicando que la interrupción externa ha ocurrido. Mirar Figura 5.

Figura 5. Interrupción Externa

En la sección 4.2, “PORTB and the TRISB register”, se explica que 4 de los pines del Puerto B, RB7: RB4, tienen una característica de interrupción al cambio. Sólo los pines configurados como entrada pueden causar que esta interrupción ocurra. La interrupción funciona al comparar los pines de entrada con el valor almacenado en la lectura previa del Puerto B. Al haber un estado diferente en cualquiera de los pines de entrada se pone a 1 el bit de bandera RBIF(INTCON < 0 >). Mirar Figura 6.

Figura 6. Interrupción RB

Cabe señala que al producirse un cambio en cualquiera de sus entradas, se activa la interrupción. El programador debe ser capaz de determina qué pin cambió de estado. Software: La directiva utilizada en el manejo de las interrupciones es #INT_xxxx. Esta indica que la función que le sigue es una función de interrupción. El compilador generará el código para saltar a la función asociada a la interrupción cuando ésta ocurra. Algunas directivas que soporta CCS se muestran en la Figura 7.

Page 5: Laboratorio 5 (Interrupciones)

UNIVERSIDAD NACIONAL DE INGENIERÍA

FACULTAD DE ELECTROTECNIA Y COMPUTACIÓN ELECTRÓNICA DIGITAL II

DEPARTAMENTO SISTEMAS DIGITALES Y TELECOMUNICACIONES

Figura 7. Algunas directivas con que dispone CCS.

No todas las directivas pueden ser usadas con todos los microcontroladores. Para saber qué interrupciones dispone un microcontrolador es necesario abrir su archivo de encabezado (. h) y observar sus constantes, como en la Figura 8.

Figura 8. Interrupciones definidas en .

Las funciones utilizadas para el manejo de las directivas de interrupción están en la Figura 9.

Page 6: Laboratorio 5 (Interrupciones)

UNIVERSIDAD NACIONAL DE INGENIERÍA

FACULTAD DE ELECTROTECNIA Y COMPUTACIÓN ELECTRÓNICA DIGITAL II

DEPARTAMENTO SISTEMAS DIGITALES Y TELECOMUNICACIONES

Figura 9. Funciones que controlan las directivas de interrupciones.

Las funciones más utilizadas son:

· enable_interrupts(nivel): nivel es una de las constantes definidas en la Figura 5. Esta función pone a 1 el bit que habilita la interrupción determinada.

· disable_interrupts(nivel): nivel es una de las constantes definidas en la Figura 5. Esta función pone a 0 el bit que deshabilita la interrupción determinada.

El programa DEBE llamar a enable_interrupts(INT_xxxx) para habilitar la interrupción, junto a enable_interrupt(GLOBAL) para activar las interrupciones previamente habilitadas. La función para configurar en qué flanco se activará la interrupción externa en RB0 es:

· ext_int_edge(H_TO_L): La interrupción es por flanco de caída. · ext_int_edge(L_TO_H): La interrupción es por flanco de subida.

Compilar el código de la Tabla 1 y simular el circuito de la Figura 10.

Page 7: Laboratorio 5 (Interrupciones)

UNIVERSIDAD NACIONAL DE INGENIERÍA

FACULTAD DE ELECTROTECNIA Y COMPUTACIÓN ELECTRÓNICA DIGITAL II

DEPARTAMENTO SISTEMAS DIGITALES Y TELECOMUNICACIONES

Tabla 1

Figura 10. Circuito para la interrupción externa.

#include <16F877A.h> #fuses HS, NOWDT #use delay (clock=4M) #byte trisb=0x86 //Locación en la memoria del registro de dirección de datos del puerto B #INT_EXT //Directiva Interrupción Externa (INTF (INTCON<1>) está en 1) void cambio() //ISR { output_toggle(PIN_B7); // Complementa el estado del Pin B7 } void main() { trisb=0x01; //B0 como entrada, el resto de pines como salida output_high(PIN_B7); enable_interrupts(INT_EXT); //Habilitación interrupción RB0 (Pone INTE (INTCON<4>) a 1) ext_int_edge(L_TO_H); //Activado por flanco de subida (Pone INTEDG (OPTION_REG<6>) a 1) enable_interrupts(GLOBAL); //Habilitación general while(TRUE) //Bucle infinito { } }

Page 8: Laboratorio 5 (Interrupciones)

UNIVERSIDAD NACIONAL DE INGENIERÍA

FACULTAD DE ELECTROTECNIA Y COMPUTACIÓN ELECTRÓNICA DIGITAL II

DEPARTAMENTO SISTEMAS DIGITALES Y TELECOMUNICACIONES

La interrupción RB ocurre cuando haya cualquier cambio en los pines B4 − B7. Sólo hay una interrupción y el PIC no dice cuál pin cambió. El programador debe determinar el cambio basado en el valor previamente conocido del puerto3. Además, una presión del botón puede causar diversas interrupciones debido al rebote en el switch. Un algoritmo de antirebote debe ser usado. Para elaborar el código es necesario revisar el código ejemplo EX_PBUTT. c, ubicado en la carpeta Examples de PIC C. Dicho código muestra cómo controlar la interrupción del puerto B en cambio de pin. Compilar el código de la Tabla 2 y simular el circuito de la Figura 11. 3 Manual del compilador CCS

Page 9: Laboratorio 5 (Interrupciones)

UNIVERSIDAD NACIONAL DE INGENIERÍA

FACULTAD DE ELECTROTECNIA Y COMPUTACIÓN ELECTRÓNICA DIGITAL II

DEPARTAMENTO SISTEMAS DIGITALES Y TELECOMUNICACIONES

Tabla 2. Código Interrupción RB.

#include <16F877A.h> #fuses HS, NOWDT #use delay (clock=4M) #byte trisb=0x86 //Locación en la memoria del registro de dirección de datos del puerto B #INT_RB // Directiva Interrupción Port B (RBIF (INTCON<0> está en 1) void detect_rb_change() // ISR { int actual; static int anterior=0; //Variable global es inicializada a 0 actual=input_b(); // Se almacena el valor del estado de los pines del puerto B en la variable actual if ((!bit_test(anterior,4))&&(bit_test(actual,4))) // B4 cambió a 1 { output_high(PIN_B0); } if ((!bit_test(anterior,5))&&(bit_test(actual,5))) // B5 cambió a 1 { output_high(PIN_B1); } if ((!bit_test(anterior,6))&&(bit_test(actual,6))) // B6 cambió a 1 { output_high(PIN_B2); } if ((!bit_test(anterior,7))&&(bit_test(actual,7))) // B7 cambió a 1 { output_high(PIN_B3); } if ((!bit_test(actual,4))&&(bit_test(anterior,4))) // B4 cambió a 0 { output_low(PIN_B0); } if ((!bit_test(actual,5))&&(bit_test(anterior,5))) // B5 cambió a 0 { output_low(PIN_B1); } if ((!bit_test(actual,6))&&(bit_test(anterior,6))) // B6 cambió a 0 { output_low(PIN_B2); } if ((!bit_test(actual,7))&&(bit_test(anterior,7))) // B7 cambió a 0 { output_low(PIN_B3); } anterior=actual; // Se almacena el valor actual del puerto en la interrupción en la variable anterior. } void main() { trisb=0xF0; //B4-B7 como entrada, el resto de pines como salida output_low(PIN_B0); output_low(PIN_B1); output_low(PIN_B2); output_low(PIN_B3); enable_interrupts(INT_RB); //Habilitación interrupción RB (Pone RBIE (INTCON<3>) a 1) enable_interrupts(GLOBAL); //Habilitación general while(TRUE) //Bucle infinito { } }

Page 10: Laboratorio 5 (Interrupciones)

UNIVERSIDAD NACIONAL DE INGENIERÍA

FACULTAD DE ELECTROTECNIA Y COMPUTACIÓN ELECTRÓNICA DIGITAL II

DEPARTAMENTO SISTEMAS DIGITALES Y TELECOMUNICACIONES

Figura 11. Circuito para la interrupción en el puerto B.

4. Trabajo a Entregar (Reporte)