Autor Tema: Duda con interrupciones y vector interrupcion  (Leído 3364 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado lolos123

  • PIC12
  • **
  • Mensajes: 53
Duda con interrupciones y vector interrupcion
« en: 18 de Enero de 2005, 13:13:00 »
Que tal, quiero programar un pic 16f876 utilizando lenguaje ensamblador y usando interrupciones y claro está tengo unas preguntillas.

La cuestión es que tengo unas cuantas fuentes de interrupción como por ejemplo USART, T1, escritura lectura EEPROM y otras, y creo que el PIC sólo tiene un vector de interrupción, por lo que si no estoy equivocado al producirse una interrupción saltará a donde tu le digas, pero saltará siempre a ese mismo sitio sea cual sea el motivo de la interrupción ¿no es así?.Si no es así, por favor decirlo.

Pues bién, dentro de la subrutina de atención a la interrupción ¿cómo se hace para saber quién ha provocado la interrupción y así ejecutar unas instrucciones u otras?¿se usan los flags que provocan las interrupciones ?

Seguramente las interrpciones se producirán de forma cíclica, por ejemplo primero se producirá una interrupcion por T1 luego USART etc, por lo que otra duda es ¿para seguir un orden de interrrupciones que debo hacer, ir habilitando  y deshabilitando interrupciones y borrando flags dentro del programa escrito dentro de la subrutina de atencion a la interrupción?

Bueno no se si ha quedado claro, agradezco cualquier sugerencia y comentario

Gracias por vuestro tiempo


Desconectado pocher

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2569
RE: Duda con interrupciones y vector interrupcion
« Respuesta #1 en: 19 de Enero de 2005, 00:05:00 »
Lo que tienes que hacer nada más entrar en la rutina de atención a la interrupción es con btfss + GOTO ir preguntando que flag de interrupción es el que se ha disparado, cuando encuentre el que está a 1 el GOTO lo mandará a esa rutina, al finalizar las rutinas correspondientes acuerdate de borrar los flags.

Un saludo

Desconectado lolos123

  • PIC12
  • **
  • Mensajes: 53
RE: Duda con interrupciones y vector interrupcion
« Respuesta #2 en: 19 de Enero de 2005, 03:17:00 »
y para hacer una interrupción despues de otra ¿voy habilitando las interrupciones según me interese? ¿no es así?.
Antes de habilitar borro el flag por si se produjo un a interrupción mientras estaba inhabilitada ¿cierto?

Gracias por responder, y por vuestro tiempo.

Desconectado pocher

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2569
RE: Duda con interrupciones y vector interrupcion
« Respuesta #3 en: 19 de Enero de 2005, 05:06:00 »
Todas aquellas interrupciones que vayas a gastar debes habilitarlas inicialmente, para que cuando se produzca alguna de ellas salte al vector de interrupción y se pregunte cual es la que se ha disparado.

Acuerdate también que cuando estas metido dentro de una rutina de interrupción, no se atiende a ninguna otra interrupción ya que GIE=0. Este bit no es necesario pasarlo a 1 al salir de la interrupción, el solo pasa automáticamente a 1. Sí que hay que borrar  obligatoriamente el flag antes de salir.

Si te interesa en un determinado momento de tu programa que esten unas interrupciones habilitadas y otras no pues reprogramas el INTCON sobre la marcha.

Un saludo

Desconectado RALF2

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2062
RE: Duda con interrupciones y vector interrupcion
« Respuesta #4 en: 29 de Enero de 2005, 02:02:00 »
Cuando se genera una interrupcion el contador de programa se va a la direccion 4h, que es la direccion del vector de interrupcion una vez alli colocas un goto a donde tengas escrita la rutina de servicion de interrupciones (RSI), luego con la instruccion btfss se chequea cual flag fue el que habilito la interrupcion una vez determinado esto haces un CALL para llamar a la rutina que atendera la causa que genero la interrupcion que fue habilitada.  Se ejecuta el programa que hallas escrito en ella, despues borras el flag que genero la interrupcion luego colocas un return para que vuelvas a la RSI y una vez en esta colocas al final la instruccion RETIFIE para habilitar de nuevo las interrupciones (GIE=1).
mira aqui que hay mas informacion:
http://www.autric.com/Microbotica%20y%20Mecatronica/interrupciones.htm

Nota: siempre se debe borrar el flag que se activo despues de atender la RSI
Y al culminar la RSI se debe colocar un RETIFIE para volver a activar las interrupciones

Saludos