Autor Tema: Pregunta sobre interrupciones  (Leído 2185 veces)

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

Desconectado kuku_jerez

  • PIC10
  • *
  • Mensajes: 20
Pregunta sobre interrupciones
« en: 19 de Mayo de 2005, 01:59:00 »
Hola a todos desde Burgos.

       Estoy iniciandome en ensamblador con pics. Tengo muchas dudas que ya ire resolviendo pero tengo una que me intriga mucho.
      Trabajo con un 16f819 y según el datasheet tan solo hay un vector de interrupción en 04h. Mi pregunta es si todas las interrupciones van ahí y si es así si existe alguna rutina para identificar de donde procede la interrupción. Si dos interrupciones ocurriesen a la vez que pasaría? O como se trata? Estaré muy agradecido si me aclarais un poco de como se manejan o como se trabaja con ellas. Muchas gracias y saludos.Angelito


Desconectado antoniof

  • Moderadores
  • PIC24F
  • *****
  • Mensajes: 729
RE: Pregunta sobre interrupciones
« Respuesta #1 en: 19 de Mayo de 2005, 03:46:00 »
Buenas.

Los PICs de gama media sólo tienen un vector de interrupción, lo que quiere decir que todas las interrupciones van al mismo sitio. Para distinguir entre una u otra debes comprobar los flags de interrupción que están en los registro PIR o INTCON. Por ejemplo para la interrupción por cambio de estado en el puerto B, cuando salta la interrupción se activa el flag RBIF en el rgistro INTCON. Testeando los flgas de cada interrupción que esté activa, puedes saber la fuente de interrupción.

En el caso de que se produzca una interrupción cuando se está atendiendo a otra, no ocurre nada, pues cunado se produce la primera, se desactiva el bit GIE y, por lo tanto, se desabilitan todas las demás interrupciones. Cuando se termina de atender a una interrupciónhay que borrar por software el flag de la misma, por ejemplo el RBIF, y por último con un "retfie" se vuelven a habilitar las interrupciones automáticamente poniendo el bit GIE a 1.

Desconectado kuku_jerez

  • PIC10
  • *
  • Mensajes: 20
RE: Pregunta sobre interrupciones
« Respuesta #2 en: 23 de Mayo de 2005, 01:09:00 »
Muchas gracias Antonio. Me ha servido de muchoFlash

Saludos desde Burgos

Desconectado Micom

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 782
RE: Pregunta sobre interrupciones
« Respuesta #3 en: 24 de Mayo de 2005, 00:29:00 »
Aqui hay un pequeño programita que usa interrupciones para generar un secuenciador de cuatro leds si no me equiboco:

http://www.todopic.com.ar/asm/_PRINCIPIANTES/ledpi.txt

Espero te sirva. Hata pronto.
El programador GTP USB PLUS es un super programador
GRACIAS dobles amigo SISPIC

Tan solo queda seguir sobreviviendo

Desconectado mario_pastor

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 101
RE: Pregunta sobre interrupciones
« Respuesta #4 en: 25 de Mayo de 2005, 00:11:00 »
Saludos, es muy cierto que en esta gama sólo hay un vector de interrupción a la cual todas las interrupciones acceden Enfurruñado    La solución Idea es hacer una rutina que evalue una a una las posibles interrupciones habilitadas en nuestro programa y atenderlas por orden de prioridad Giño    Por ejemplo, si en nuestro programa sólo deseamos tener interrupciones por desbordamiento del TMR0 (T0IE=1) y por cambio de estado en PORTB (RBIE=1), además de habilitar el permiso general de interrupciones (GIE=1) y borrar los respectivos FLAGS de las mismas (T0IF=0  y  RBIF=0). Ahora debemos de dar prioridades de atención y para nuestro ejemplo TMR0 será la de mayor importancia, seguida por RBIE y así sucesivamente si tuvieramos más interrupciones. El código que se muestra, es la estructura que sigo para atender las fuentes de interrupción.

Codigo:
; VECTOR DE INTERRUPCION
   ORG   4
   MOVWF   W_TEMP         ;SALVO EL REGISTRO W
   SWAPF   STATUS,W
   MOVWF   STATUS_TEMP      ;SALVO EL REGISTRO STATUS
   CLRF   STATUS         ;TRABAJO EN BANK 0
   MOVFW   PCLATH         ;SALVO EL REGISTRO PCLATH
   MOVWF   PCLATH_TEMP
   CLRF   PCLATH
      
; EXPLORANDO QUE FLAG ACTIVO LA INT.
OTHER_INT1
   BTFSS   INTCON,TOIF      ;INT POR TMR0
   GOTO   OTHER_INT2
   BCF   INTCON,TOIF                 ;BORRAMOS FLAG
                -
                -
                -
                -
   
OTHER_INT2
   BTFSS   INTCON,RBIF
   GOTO   SALIR
   BCF   INTCON,RBIF                 ;BORRAMOS FLAG
                -
                -
                -
                -

SALIR      
   MOVFW   PCLATH_TEMP
   MOVWF   PCLATH
   SWAPF   STATUS_TEMP,W
   MOVWF   STATUS
   SWAPF   W_TEMP,F
   SWAPF   W_TEMP,W
   RETFIE



Supongamos este primer evento...  nuestro programa se está ejecutando y de pronto sólo el TMR0 se desborda. En este caso se activará su respectivo FLAG (T0IF=1) haciendo que el programa salte a la dirección 0x04 para atender la interrupcíón; a su vez se desabilita GIE=0  lo que no quiere decir que si por algún motivo ocurra otra posible "interrupción" no deje de activarse su respectivo FLAG. Aquí debemos verificaremos si es que realmente ocurrió la interrupción revisando el estado de su respectivo FLAG, luego borramos su FLAG para que no origine una falsa interrupción a la hora de salir de esta rutina, después procedemos a realizar el código para esa interrupción. Por último, verificamos las demás fuentes de posibles interrupciones por si alguna se originó durante el análisis de la primera. Al ejecutar el comando RETFIE habilitamos nuevamente GIE=1 para permitir que el programa salte nuevamente a la posición 0x04 cuando se ejecute alguna interrupción.

Ahora supongamos este segundo evento... que las 2 fuentes de interrupción (T0IF = RBIF = 1) se activen al mismo tiempo. Al igual que en el primer caso, el programa saltará a la posición 0x04 y GIE=0, pero la prioridad de atención a las interrupciones se ejecutará de acuerdo a como lo estabecimos en nuestra rutina, y para nuestro ejemplo sería primero TMR0 y por último RB. Siempre se verificará el estado del FLAG y se borrará por software para que no origine falsas interrupciones al salir de la rutina de servicio de interrupciones.

Como último evento... que sólo se active la interrupción por RB, en este caso se evalúa el FLAG de TMR0 y al encontrarse en 0 saltará para atender la interrupción que origino el salto del programa.

Bueno espero haber sido claro en esta explicación y no haberlos confundido  Sonrisa Gigante
Saludos,
Mario.

Lima - Perú