Diferencia entre revisiones de «Interrupciones»
(→KBIx:) |
(→IICx:) |
||
Línea 114: | Línea 114: | ||
====IICx:==== | ====IICx:==== | ||
El flag de la interrupción IICIF del registro IICxS se puede activar por:<br/> | El flag de la interrupción IICIF del registro IICxS se puede activar por:<br/> | ||
− | -Se ha terminado de transmitir un byte<br/> | + | - Se ha terminado de transmitir un byte<br/> |
− | -Coincidencia de la dirección llamada, con la dirección de esclavo<br/> | + | - Coincidencia de la dirección llamada, con la dirección de esclavo<br/> |
− | -Arbitration lost: cuando hay varios masters y uno envía un 1 lógico cuando otro envía un 0 lógico, el primero pierde su | + | - Arbitration lost: cuando hay varios masters y uno envía un 1 lógico cuando otro envía un 0 lógico, el primero pierde su condición de master y pasa a ser esclavo.<br/> |
Mask: Registro IICxC1, bit IICIE<br/> | Mask: Registro IICxC1, bit IICIE<br/> | ||
+ | |||
====SWI:==== | ====SWI:==== | ||
Interrupción solicitada por software | Interrupción solicitada por software |
Revisión del 21:51 19 nov 2012
Contenido
- 1 Interrupciones:
- 1.1 Interrupciones en microcontroladores [Freescale]
- 1.2 Interrupciones en microcontroladores [Microchip]
- 1.3 Referencias
Interrupciones:
Este artículo no pretende abarcar una definición completa de lo que son las interrupciones, ya que mucha se ha hablado previamente de ellas en otros foros y enciclopedias. Sin embargo es necesario tener una breve descripción de lo que son.
Una interrupción es un recurso del cual disponen la mayoría (sino todos) los procesadores y microcontroladores en el mercado hoy en día, el cual, permite abrir una brecha en la continuidad de desarrollo de un programa en ejecución, para atender una necesidad, ya sea externa o interna.
Como ejemplo, un botón de RESET en un dispositivo puede ser visto como una fuente de interrupción, que de manera asíncrona, detiene todos los procesos y reinicia el sistema por completo y dependiendo del sistema, lo lleva a un estado inicial.
Las interrupciones se manejan de distintas formas según el procesador, fabricante, desarrollador, etc. Hablando a nivel de microcontroladores, la mayoría tienen algo en común, y es como atienden dicha interrupción. Al recibirse una señal de interrupción, se abre la brecha en la continuidad del programa en ejecución, y se recurre a un registro llamado “Handler”, el cuál, dependiendo del microcontrolador, contendrá el código de ejecución para atender la interrupción, o contendrá una dirección donde se encontrará dicho código. Todo esto hablando a muy groso modo, ya que cada familia de microcontroladores puede poseer características específicas y únicas.
Entre las utilidades de las interrupciones podemos encontrar cosas tan simples como cambiar el valor de un puerto de 0 a 1, hasta cosas tan complejas como lo es un despachador de tareas, ambas inclusive; he allí, el poder de este recurso, que nos permite pasar de una ejecución lineal de un programa a una simulación de ejecución multitareas.
Como antes se mencionó, las interrupciones pueden tener fuentes internas y externas. Una fuente de interrupción interna puede ser por ejemplo, un error por overflow o un contador; una fuente externa, como ya se mencionó, puede ser un botón de reset, también una señal de control o un detector de cambios de nivel.
Interrupciones en microcontroladores [Freescale]
Para explicar el funcionamiento de las interupciones para este fabricante de microcontroladores, tomaremos de ejemplo al MC9S08QE128 de la familia HCS08.
Las interrupciones en el MC9S08QE128 tienen un manejo por registros de vectores, con un vector por tipo de interrupción (módulos). Esto significa, que para cada fuente de interrupción, existe un registro el cual tiene la dirección del handler de dicha interrupción. Este tipo de organización por vectores de interrupción, tiende a ser más sencillo de comprender y normalmente no es necesario realizar un polling exhaustivo a para determinar la fuente de interrupción.
Cuando una interrupción se lleva a cabo, se hace una copia de los registros necesarios en el stack para poder retornar de la misma.
En la siguiente imagen se muestra como es el estackeo al entrar y al salir de la interrupción
Cuando se solicita una interrupción se siguen los sigientes pasos:
Flag--->Revisar máscara local--->Revisar máscara global--->Solicitar interrupcion al CPU
Para el control de las interrupciones, existen una máscara global y una máscara para cada fuente de interrupción.
La máscara global para las interrupciones se encuentra en el registro CCR (Condition Code Register), específicamente el bit I. Esta máscara inhibe la mayoría de las interrupciones, sin embargo, casi todos los RESET no se ven afectados por esta máscara.
RESETs:
Entre las interrupciones encontramos este tipo de excepciones, que normalmente pertenece al grupo de control del sistema.
Cuando se lleva a cabo un Reset:
-La mayoría de los registros de estado y control son reiniciados y se obtiene el handler
-Se desactivan todos los modulos
-Todos los pines se configuran como pines de proposito general de input en alta impedancia sin pullup
-Se activa la máscara de interrupciones (BIT I CCR)
-El stack pointer SP se ubica en 0x00FF.
Existen varias fuentes de reset:
-Power-on-reset (POR): Inicio del equipo
-External pin reset (PIN): Si está configurado, el pin /RESET será la fuente de la interrupcion
-Watchdog - COP (Computer Operating Properly): un modulo adicional que se encarga de verificar que el programa en ejecucion no se ha quedado en un loop infinito o en una traba.
-Opcode ilegal (ILOP): se trata de ejecutar una instruccion considerada ilegal.
-Bajo voltaje(LVD): ya sea por advertencia o deteccion de bajo voltaje.
-Reinicio forzado por debug.
Vectores de Interrupcion para el MC9S08QE128:
En la siguiente imagen se pueden observar todos los vectores de interrupcion, además organizados por prioridad. Aqui se detallan las máscaras (ENABLE) para cada interrupción, así como su fuente (SOURCE).
Fuentes de interrupciones:
WATCHDOG:
Generado por el Computer Operating Properly (COP)
Mask: Registro SOPT1, bit COPE
IRQ:
Interrupción externa manejada según la configuración del registro IRQSC
Mask: Registro IRQSC, bit IRQPE
LVD:
Interrupción generada por el detector de bajo voltaje
Mask: Registro SPMSC1, bit LVDE (set), bit LVDIE (set), bit LVDRE (clear)
TPMx - TOF:
Overflow de contador
Mask: Registro TPMxSC, bit TOIE
TPMx - CHnIE:
Evento CCP (Capture\Compare\PWM) en el canal n
Mask: Registro TPMxCnSC, bit CHnIE
RTC:
Overflow del contador del Real Time Clock
Mask: Registro RTCSC, bit RTIE
Para mas información visitar RTC (Real-timer counter) - MC9S08QE128
SCI - TX:
Interrupción del módulo de transmisión de datos serial
Mask: Registro SCIxC2, bit TIE, bit TCIE
Para mas información visitar SCI (Interfaz de Comunicación Serial) - MC9S08QE128
SCI - RX:
Interrupción del módulo de recepción de datos serial
Mask: Registro SCIxC2, bit RIE, bit ILIE; Registro SCIxBDH, bit LBKDIE, bit RXEDGIE
Para mas información visitar SCI (Interfaz de Comunicación Serial) - MC9S08QE128
ACMPx:
Comparador análogo, la interrupción se activa cuando una comparación ocurre en el módulo
Mask: Registro ACMPx, bit ACIE
ADC:
Conversor analógico-digital, interrumpe cuando se termina una conversión AD
Mask: Registro ADCSCI, bit AIEN
Para mas información visitar ADC (Conversor Analógico-Digital) - MC9S08QE128
KBIx:
Interrupción proveniente de cualquiera de los pines disponibles en los módulos KBI
Mask: Registro KBIxSC, bit KBIE
Para mas información visitar KBI (Keyboard interrupts) - MC9S08QE128
IICx:
El flag de la interrupción IICIF del registro IICxS se puede activar por:
- Se ha terminado de transmitir un byte
- Coincidencia de la dirección llamada, con la dirección de esclavo
- Arbitration lost: cuando hay varios masters y uno envía un 1 lógico cuando otro envía un 0 lógico, el primero pierde su condición de master y pasa a ser esclavo.
Mask: Registro IICxC1, bit IICIE
SWI:
Interrupción solicitada por software
Implementación de interrupciones en ASSEMBLER
Para habilitar y deshabilitar la máscara global de las interrupciones existen dos comandos:
CLI: Limpiar el bit I del registro CCR, activa las interrupciones
SEI: Activa el bit I del registro CCR, desactiva las interrupciones
Para activar una interrupción específica, se ha de modificar el bit correspondiente y se ha de tomar en cuenta las configuraciones que necesite.
Para activar o desactivar un bit específico en un registro se pueden utilizar los comandos
BSET y BCLR
Una vez configurados los registros necesarios, se ha de configurar el vector de interrupción deseado.
Todos los vectores de interupción estan compuestos de dos bytes, que representan la parte alta y la parte baja de la dirección del handler de la interrupción.
Es importante tomar en cuenta que si se desea asegurar que la rutina de interrupción sea accesible desde cualquier direccion sin importar el valor del PPAGE, la rutina ha de estar en la página de memoria 0,1 ó 3.
Para retornar de la interrupción usar la instrucción RTI
Ejemplo de código:
_Startup:
LDHX #RAMEnd+1 ; inicializa el stack pointer
TXS
lda #$42 ; Desactiva el COP
sta SOPT1
lda #$00 ; Se configura el módulo RTC
sta RTCMOD
lda #$18
sta RTCSC ; Se habilita la interrupción en el RTC
CLI ; Se habilitan las interrupciones globales
mainLoop: ;función principal
BRA mainLoop
RTC: ;Función handler de RTC
"Instrucciones"
RTI ;Retorno de la interrupción
ORG $FFCE ;Vector de interrupción
DC.W RTC
Implementación de interrupciones en C
Es importante incluir la librería hidef.h, esta incluye el macro para habilitar las interrupciones.
Inicialmente, habilitar las interrupciones con el macro "EnableInterrupts.
Configurar el módulo y habilitar la interrupción deseada.
Configurar la función handler de la interrupción siguiendo este formato:
void interrupt NúmeroDeVector NombreDelHandler(void) { }
A continuación, un ejemplo de código en C:
include <hidef.h> /* EnableInterrupts macro */
include "derivative.h" /* include peripheral declarations */
/*Aqui se colocan los vectores de interrupcion*/
/*ISR para la transmision*/
void interrupt VectorNumber_Vsci1tx SCI_ISR_TXC(void) {
"Instrucciones aqui"
}
/*ISR para la recepcion*/
void interrupt VectorNumber_Vsci1rx SCI_ISR_RX(void) {
"Instrucciones aqui"
}
void main(void) {
/*Condiciones iniciales*/
SOPT1_COPE =0; /*Deshabilito COP*/
EnableInterrupts; /* Activo Interrupciones */
/*Configuro el puerto serial*/
SCI1BD=0x1A; /*Baudrate*/
/*Sin paridad*/
SCI1C1_PE=0;
/*Activamos los interrupts de Transmision Completada y Recepcion*/
SCI1C2_TCIE=1;
SCI1C2_RIE=1;
/*Finalmente activamos la recepcion y la emision*/
SCI1C2_RE=1;
SCI1C2_TE=1;
/*Funcion principal*/
{
}
"Instrucciones aqui"
Interrupciones en microcontroladores [Microchip]
En los microcontroladores PIC16F87X existen muchas causas que pueden originar interrupciones; en el caso de los microcontroladores de 28 pines existen 13 posibles fuentes y en los de 40 pines 14. Cuando ocurre una interrupción, se salva el valor del PC en la pila y se carga la dirección en el vector de interrupción 0004h. Los PIC16F84, de gama más baja, poseía 4 causas que generaban interrupción:
- Desbordamiento del TMR0
- Activación en la pata de interrupción RB0/INT
- Cambios en los 4 pines de más peso en el puerto B
- Y cuando se terminaba de escribir un byte en la memoria EEPROM (Duraba 2ms!).
Los PIC16F87X, además de las anteriores poseen:
- Overflow en Timer1
- Overflow en Timer2
- Captura o comparación en el módulo CCP1
- Captura o comparación en el módulo CCP2
- Transferencias en la puerta serie síncrona SSP
- Colisión de bus en la puerta serie síncrona BCL
- Fin de transmisión USART
- Fin de recepción USART
- Fin de conversión A/D
- Transferencias en la puerta paralela esclava (menos en los de 28 pines)
Para manejar las máscaras de las interrupciones por TMR0, los 4 pines del puerto b y el pin RB0/INT, se usa el registro INTCON (0Bh, 8Bh, 10Bh, 18Bh).
Para las causas de interrupciones A/D, RxUART, TxUART, SSP, CCP1, TMR1 y TMR2 se usa el registro PIE1 (8Ch), sin embargo el bit PEIE en INTCON esté habilitado.
Para las causas escritura en EEPROM, BCL y CCP2 se usa el registro PIE2
En correspondencia con los registros de habilitación de interrupciones PIE1 y PIE2, existen los registro PIR1 (0Ch) y PIR2 (0Dh) que señalan los módulos que originan la causa que provoca la interrupción, estén o no habilitadas dichas interrupciones.
Referencias
Contributors
AK, Artdamato, CeMoron, Fer, GMarzinotto, Hyma, LuisiVelas, Minleung, Racuna, Ramor