Laboratorio 5 (Interrupciones)

12
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 RB ¿ e 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. 1 Compilador C CCS y Simulador Proteus para Microcontroladores PIC, Eduardo García Breijo, Alfaomega

description

Interrupciones

Transcript of Laboratorio 5 (Interrupciones)

UNIVERSIDAD NACIONAL DE INGENIERA

FACULTAD DE ELECTROTECNIA Y COMPUTACIN

ELECTRNICA DIGITAL IIDEPARTAMENTO SISTEMAS DIGITALES Y TELECOMUNICACIONES

Laboratorio 5: Interrupciones

1. Objetivos

Comprender el uso de las interrupciones con que dispone el microcontrolador. Usar las interrupciones e

2. IntroduccinLas interrupciones permiten a cualquier suceso interior o exterior al interrumpir la ejecucin del programa principal () en cualquier momento. En el momento de producirse la interrupcin, el PIC ejecuta un salto a la rutina de atencin a la interrupcin (, Interrupt Service Routine), previamente definida, donde se atender a la demanda de la interrupcin. Cuando se termina de ejecutar dicha rutina, el PIC retorna a la ejecucin del programa principal en la misma posicin de la memoria de programa donde se ejecut la interrupcin[footnoteRef:1]. Mirar Figura 1. [1: Compilador C CCS y Simulador Proteus para Microcontroladores PIC, Eduardo Garca Breijo, Alfaomega]

Figura 1. Flujo de una interrupcin en la programacin[footnoteRef:2] [2: http://www.puntoflotante.net/INTERRUPCIONES-18F2550-TIMER-0.htm]

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 ms bien deja estipulado qu funcin realizar en tal caso.Cada microcontrolador vara en la cantidad de interrupciones que dispone. El posee 15. Mirar Figura 2.

Figura 2. Cantidad de interrupciones de la familia 16F87XA. Los registros que controlan las interrupciones estn en la seccin Registros de Funcin Especial (Special Function Registers, en ingls) del captulo 2 Organizacin de la Memoria de Datos (Data Memory Organization, en ingls). Estos son: En la Figura 3 se muestran las interrupciones que el registro controla. Al configurar los bits de los registros, se habilita o deshabilita una o varias interrupciones. Al producirse una interrupcin determinada, sta afectar el bit de flag, en el registro correspondiente, para indicar que la interrupcin ha ocurrido.

Figura 3. Interrupciones que controla el registro .En este laboratorio se aprender a utilizar las interrupciones e , las cuales responden a un cambio de nivel (de alto a bajo o de bajo a alto) en y un cambio de estado en los pines del Puerto B, respectivamente.

3. Desarrollando el cdigo

Hardware:

La seccin , Interrupts, explica lo fundamental del manejo de las interrupciones. Indica que el Bit de Habilitacin de Interrupcin Global (Global Interrupt Enable Bit) GIE, ubicado en el Bit 7 del registro INTCON (), habilita (si est a ) todas las interrupciones o deshabilita (si est a ) todas las interrupciones. Mirar Figura 4.

Figura 4. Eplicacin del Global Interrupt Enable.En la seccin , INT Interrupt, se explica cmo funciona la interrupcin externa en . La interrupcin externa es activada por flanco, puede ser por flanco ascendente si el bit () est a , o por flanco descendente si el bit est a . Cuando un flanco vlido aparece en el pin , su bit de bandera es puesto a , indicando que la interrupcin externa ha ocurrido. Mirar Figura 5.

Figura 5. Interrupcin ExternaEn la seccin , PORTB and the TRISB register, se explica que 4 de los pines del Puerto B, , tienen una caracterstica de interrupcin al cambio. Slo los pines configurados como entrada pueden causar que esta interrupcin ocurra. La interrupcin 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 el bit de bandera . Mirar Figura 6.

Figura 6. Interrupcin RBCabe seala que al producirse un cambio en cualquiera de sus entradas, se activa la interrupcin. El programador debe ser capaz de determina qu pin cambi de estado.

Software:

La directiva utilizada en el manejo de las interrupciones es . Esta indica que la funcin que le sigue es una funcin de interrupcin. El compilador generar el cdigo para saltar a la funcin asociada a la interrupcin cuando sta ocurra. Algunas directivas que soporta CCS se muestran en la Figura 7.

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 () y observar sus constantes, como en la Figura 8.

Figura 8. Interrupciones definidas en Las funciones utilizadas para el manejo de las directivas de interrupcin estn en la Figura 9.

Figura 9. Funciones que controlan las directivas de interrupciones.Las funciones ms utilizadas son: es una de las constantes definidas en la Figura 5. Esta funcin pone a el bit que habilita la interrupcin determinada. es una de las constantes definidas en la Figura 5. Esta funcin pone a el bit que deshabilita la interrupcin determinada.

El programa DEBE llamar a para habilitar la interrupcin, junto a para activar las interrupciones previamente habilitadas.

La funcin para configurar en qu flanco se activar la interrupcin externa en es: La interrupcin es por flanco de cada. La interrupcin es por flanco de subida.

Compilar el cdigo de la Tabla 1 y simular el circuito de la Figura 10.

#include #fuses HS, NOWDT#use delay (clock=4M)#byte trisb=0x86 //Locacin en la memoria del registro de direccin de datos del puerto B

#INT_EXT //Directiva Interrupcin Externa (INTF (INTCON) 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); //Habilitacin interrupcin RB0 (Pone INTE (INTCON) a 1) ext_int_edge(L_TO_H); //Activado por flanco de subida (Pone INTEDG (OPTION_REG) a 1) enable_interrupts(GLOBAL); //Habilitacin general while(TRUE) //Bucle infinito { }}

Tabla 1

Figura 10. Circuito para la interrupcin externa.

La interrupcin ocurre cuando haya cualquier cambio en los pines . Slo hay una interrupcin y el PIC no dice cul pin cambi. El programador debe determinar el cambio basado en el valor previamente conocido del puerto[footnoteRef:3]. Adems, una presin del botn puede causar diversas interrupciones debido al rebote en el switch. Un algoritmo de antirebote debe ser usado. [3: Manual del compilador CCS]

Para elaborar el cdigo es necesario revisar el cdigo ejemplo , ubicado en la carpeta Examples de PIC C. Dicho cdigo muestra cmo controlar la interrupcin del puerto B en cambio de pin.

Compilar el cdigo de la Tabla 2 y simular el circuito de la Figura 11.#include #fuses HS, NOWDT#use delay (clock=4M)#byte trisb=0x86 //Locacin en la memoria del registro de direccin de datos del puerto B

#INT_RB // Directiva Interrupcin Port B (RBIF (INTCON 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 interrupcin 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); //Habilitacin interrupcin RB (Pone RBIE (INTCON) a 1) enable_interrupts(GLOBAL); //Habilitacin general while(TRUE) //Bucle infinito { }}

Tabla 2. Cdigo Interrupcin RB.

Figura 11. Circuito para la interrupcin en el puerto B.4. Trabajo a Entregar (Reporte)