Download pptx - Interrupciones_externas

Transcript

Electrónica Digital II

Temas

•Interrupciones (Introducción)•Fuentes de Interrupción•Registro INTCON•Lógica del sistema de interrupción•Qué sucede cuando ocurre un evento que dispara una interrupción•Guardado de Contexto•Interrupción Externa (Introducción)•Registros Asociados

•Interrupciones

Supondremos que nuestro microcontrolador está desarrollando una tarea, la cual puede ser cualquiera de los programas que hemos desarrollado hasta ahora. Sucede un evento que necesita ser atendido, para esto es necesario detener la tarea actual ya que dicho evento tiene mayor prioridad. Este evento disparará una Interrupción que le dirá al microcontrolador que debe dejar lo que está haciendo dado que el evento que generó la Interrupción es de mayor prioridad.

Es el típico ejemplo: estoy leyendo un libro y alguien toca el timbre, debo atender la puerta porque puede que esa persona se canse y se vaya o puede que me busquen por una emergencia.

•Fuentes de interrupción PIC16F887

•Registro INTCON

El registro INTCON es el encargado de habilitar las interrupciones. Además cada vez que se genera un evento como desbordamiento de TIMER0, cambios en el puerto B o Interrupciones externas, las banderas T0IF, RBIF, INTF se colocan en ‘1’ avisando qué tipo de evento fue el que generó la interrupción.

•Registro INTCON

Para que se genere una interrupción, deben suceder 2 cosas, debe estar habilitada la interrupción, y debe suceder el evento que disparará la interrupción.

GIE: habilita todas las interrupciones, si este bit no está habilitado, aunque habilitemos todas las interrupciones y aunque se generen los eventos que disparan las interrupciones, no se ejecutará ninguna interrupción.

T0IE: habilita interrupción por desbordamiento de TIMER0INTE: habilita la interrupción ExternaRBIE: habilita la interrupción por cambios en el puerto B

T0IF: Se coloca en ‘1’ cuanto TIMER0 se ha desbordado (se baja por software)INTF: se coloca en ‘1’ si sucedió una interrupción externa (se baja por software)RBIF: se coloca en ‘1’ si hubo un cambio de estado en los pines del puerto B (se baja por software)

Puede que se generen los eventos que dispararían las interrupciones, sin embargo no se generará la interrupción si no está habilitada mediante su correspondiente bit de habilitación.

•Lógica del Sistema de Interrupciones

•Qué sucede cuando ocurre un evento que dispara una interrupción

•Qué sucede cuando ocurre un evento que dispara una interrupción

•El programa se ejecuta línea a línea.•Se produce un evento, y debido a que la interrupción asociada a ese evento estaba habilitada se genera la interrupción luego de ejecutar la última instrucción que estaba en proceso.•La Dirección de retorno* se almacena en la pila•El contador de programa se carga con 0x04•La habilitación de interrupciones globales (GIE) se pone a ‘0’ para evitar que otra interrupción se ejecute mientras se está atendiendo la primera.

*La dirección de retorno es la dirección de la instrucción siguiente a la que se estaba ejecutando previo a la interrupción

•Qué sucede cuando ocurre un evento que dispara una interrupción

•Una vez que estamos en la Dirección 0x04 de la memoria de programa hacemos un salto hacia la rutina de interrupción•En la rutina de interrupción se deberán llevar a cabo varios puntos importantes:• Guardado de contexto• Preguntar cual fue la fuente de interrupción• Saltar a la parte del código que corresponda a

cada fuente de interrupción• Ejecutar la parte del código correspondiente a la

fuente de interrupción.

*En el caso de que solo utilicemos un tipo de interrupción, no es necesario diseñar un código que determine cuál fue la fuente de interrupción

•Qué sucede cuando ocurre un evento que dispara una interrupción

•Una vez atendida la rutina de Interrupciones procedemos a los siguientes pasos:• Recuperar el contexto• Bajar la bandera de la interrupción que se acaba

de atender (se bajan por software) dado que de lo contrario volveremos a entrar en la misma interrupción.

• Volver a la dirección de retorno (RETFIE*)

*La instrucción RETFIE carga la dirección de retorno en el PC y habilita nuevamente GIE.

Supondremos que el microcontrolador está haciendo una operación matemática muy compleja, la cual va almacenando el resultado de dichos cálculos en el registro WREG.

A su vez, los resultados de estas operaciones afectan los bits del registro STATUS, según el tipo de operación.

Debido a esto, cuando entramos a una rutina de interrupción WREG y STATUS tienen valores que son consecuencia de las operaciones que estábamos realizando en la rutina principal.

Si dentro de la rutina de interrupción se modifica W y/o STATUS, cuando retornemos a la operación matemática, con WREG y/o STATUS, afectaremos el curso del programa por haber modificado estos registros.

Debido a esto, una de las primeras operaciones que realizamos luego de que surge una interrupción es guardar WREG y STATUS (contexto)

•Guardado de Contexto

Cuando guardemos W y STATUS no podemos utilizar funciones que afecten STATUS por lo que no utilizaremos MOVF. Utilizaremos SWAPF. A acontinuación puede verse un ejemplo mostrado en la hoja de datos de cómo guardar W y STATUS en variables temporales W_TEMP y STATUS_TEMP

•Guardado de Contexto

•Interrupción Externa

La interrupción externa consiste en un pulso de tensión con determinado flanco que aparece en un pin del microcontrolador. Este pulso de tensión presente en la pata del microcontrolador puede deberse a varios fenómenos físicos, entre ellos puede ser el accionamiento de un pulsador (nuestro caso), pero puede ser la señal proveniente de un comparador analógico o digital, o una señal de alerta de un sensor de incendio, etc.

El pin que recibe las interrupciones externas en nuestro microcontrolador es RB0, el pin 0 del puerto B, el cual tenemos conectado a un pulsador de nuestra placa de evaluacion, el pulsador IE.

Para poder utilizar el pin RB0 como interrupción externa.

1. Configurar el pin como Entrada/Salida Digital, no como entrada analógica (ANSELH)

2. Configurar el pin como Entrada Digital, TRISB

•Interrupción Externa

•Interrupción Externa

Recordando el esquema circuital del pulsador IE tenemos las siguientes conecciones

•Interrupción Externa

Haciendo mayor aumento podemos ver que el pin RB0, que es el que tiene la función de disparar las interrupciones externas está conectado a un pulsador “IE” el cual, cuando es presionado conecta RB0 a GND, colocando un ‘0’ en RB0

La pregunta en este punto es: donde está conectado RB0 cuando no está presionado el pulsador? Qué dato está presente en RB0, ‘1’ o ‘0’?

La realidad es que el pin está al aire, y nunca debemos tener un pin de entrada conectado a ‘ninguna parte’ cuando el programa depende del estado de ese pin. Por esto debemos conectar RB0 a la tensión de alimentación mediante un resistor de modo que cuando no esté precionado el pulsador IE, RB0 tenga un ‘1’ presente. Y cuando esté presionado ‘0’

•Interrupción Externa

Ese Resistor lo podemos conectar externamente, sin embargo el microcontrolador nos permite conectarlo internamente, el puerto B cuenta con una serie de resistores de pull up que podemos conectar entre los pines del puerto B y alimentación.

De esta manera, cuando el pulsador está presionado el pin está conectado a GND colocando ‘0’, cuando el pulsador está desconectado, a bornes tenemos ‘1’ proveniente del resistor de PULL UP.

Para utilizar los resistores de PULL UP debemos ir al registro de opciones OPTION_REG

•Interrupción Externa Registros asociados

El BIT 7 RBPU (negado) habilita los resistores de pull up, solo basta seleccionar cuáles vamos a conectar en el registro WPUB

Una vez habilitado RBPU(negado) venimos al registro WPUB y seleccionamos qué resistores del puerto B queremos conectar, necesitamos el WPUB0 (resistor de pull up del pin RB0), los demás no son relevantes.

•Interrupción Externa Registros asociados

Ahora tenemos:

1. Puerto B como Entrada/Salida digital (ANSELH)2. Puerto B como entrada digital (TRISB)3. Con resistor de pull up activados (RBPU(negado))4. Con resistores de pull up conectados (WPUB)

Con esto tenemos el pin preparado para ser utilizado como entrada de interrupción externa

Ahora configuramos la interrupción, 1. Sabemos que la interrupción se genera debido a un flanco de tensión, en el

OPTION_REG configuramos si ese flanco será de subida o de bajada, bit 6 del registro OPTION_REG, INTEDG.

2. Tendremos que habilitar las interrupciones globales, GIE (INTCON)3. Tendremos que habilitar la interrupción externa, INTE

•Interrupción Externa Registros asociados

•Interrupción Externa Registros asociados

Una vez que configuramos todo lo visto hasta ahora, en el momento en que el pin RB0 vea un flanco de tensión según la configuración que nosotros pusimos se generará la interrupción externa.

En la dirección 0x04 debemos colocar una instrucción de salto a la etiqueta que contenga la rutina de interrupción donde se deberán verificar todos los puntos mencionados anteriormente (guardado de contexto, chequeo de banderas, etc. )