¿Cuál es la diferencia entre interrupción en cambio e interrupción externa en PIC?

¿Cuál es la diferencia de función entre IOC y EXT Interrupt en un PIC? Actualmente estoy usando un PIC12F1822 y, aparte de la capa adicional de verificación que tiene que ver con IOC (es decir, qué pin causó la interrupción), los dos son idénticos.

¿Cuál es la diferencia práctica si la hay? ¿Cuándo usarías uno u otro?

Respuestas (5)

Mire este documento que dice: -

Interrupción por cambio
Esta función es similar a la función de interrupción externa , excepto que cualquier cambio (no solo un tipo de transición) activará una interrupción de cambio de puerto en cualquiera de los pines para los que está habilitada. Esto lo hace más flexible (estar disponible en más pines), pero también más difícil de manejar correctamente.

Es probable que esto se haga para simplificar la arquitectura de interrupción del chip al tener menos entradas en la tabla de vectores de interrupción. La interrupción por cambio se puede configurar para que se dispare cuando cambia un registro de puerto y puede ser útil para algo como una matriz de teclado en la que no desea escribir una rutina de servicio de interrupción (ISR) para cada pin. Puede escribir solo uno que pueda verificar el valor de todo el puerto, que podría ser lo que realmente le interese según la aplicación.

Las tres mayores diferencias entre el cambio de interrupción y los pines de interrupción externa:

  1. Los pines de interrupción externos permiten que el software especifique si la interrupción debe activarse por un flanco ascendente o descendente; si, por ejemplo, un pin está bajo y uno solo está interesado en los bordes descendentes, no se activará una interrupción hasta que el pin suba y luego caiga. Usando la interrupción en el cambio, uno tendría que despertarse en ambos eventos.
  2. Los pines de interrupción externos tienen bits de estado de enclavamiento individuales. Incluso si un pulso de entrada aparece y desaparece antes de que el software tenga la oportunidad de responder, el software aún puede descubrir que sucedió y reaccionar adecuadamente.
  3. La lectura de un puerto de E/S que tiene una interrupción de cambio de pin habilitada precisamente en el momento en que cambia la entrada puede provocar que la interrupción de cambio de pin no se active. Por el contrario, leer el puerto de E/S conectado a un pin de interrupción externo no tiene ningún efecto sobre la interrupción.

Las interrupciones externas del PIC son más versátiles y confiables que las interrupciones de cambio de clavija de propósito general. Sugeriría usar el primero cuando sea práctico.

Básicamente, la interrupción externa se activará en un borde específico (ascendente o descendente, definido por el usuario), mientras que la interrupción por cambio se activará en cualquier borde (tanto ascendente como descendente).

Al menos para el PIC12F1822 mencionado en el OP, el IOC también se puede configurar (definido por el usuario) para activarse en el flanco ascendente, flanco descendente o ambos (sección 13). Entonces, para mí, la única diferencia parece ser que la interrupción externa solo se puede configurar para activarse en cualquiera de las dos detecciones de borde.

La interrupción en el cambio es generalmente para medio byte de E/S, mientras que las interrupciones externas son generalmente para bits individuales. Como ya dijiste, una cosa que debes hacer en el ISR del COI es averiguar qué bit (o bits) cambió.

El COI también es un poco más difícil de usar, incluso más allá de eso. ¡Es imperativo leer el puerto poco antes de habilitar la interrupción, y aún más importante LEER EL PUERTO dentro del ISR! Si tiene una señal que cambia lentamente y cree que puede establecer una bandera dentro del ISR y hacer su lectura más tarde, fuera del ISR, ¡piénselo de nuevo! La lectura del puerto (o cualquier bit en el puerto, si no recuerdo mal), restablece el pestillo en el comparador que activa la interrupción. Si no lo borra dentro de la ISR, se reactivará inmediatamente cuando salga de la ISR. Si te acuerdas de hacer esto, todo está bien, pero si te olvidas y crees que puedes leer el puerto cuando lo hagas, te sentirás un poco frustrado hasta que te acuerdes de hacer la lectura en el ISR.