Diferencia entre revisiones de «IRQ (External Interrupt Request) - MC9S08QE128»
(→Configuración del pin IRQ) |
|||
Línea 96: | Línea 96: | ||
El siguiente paso es habilitar las interrupciones y el pin del IRQ, para esto se utiliza el registro IRQSC. El IRQPE en el registro IRQSC debe estar habilitado para que el pin IRQ pueda actuar como una entrada por petición de interrupción. | El siguiente paso es habilitar las interrupciones y el pin del IRQ, para esto se utiliza el registro IRQSC. El IRQPE en el registro IRQSC debe estar habilitado para que el pin IRQ pueda actuar como una entrada por petición de interrupción. | ||
− | |||
En este caso nos interesa habilitar los bits 1, 2 y 4. El bit 1 es el IRQIE (Interrupt Enable) con el cual se habilitan las interrupciones del IRQ, el bit 2 es el IRQACK (Acknowledge)que reconoce que se dio una interrupcion y el bit 4 es el IRQPE (Pin Enable) con el cual se habilita el pin del IRQ. Una forma de habilitar los bits es la siguiente: | En este caso nos interesa habilitar los bits 1, 2 y 4. El bit 1 es el IRQIE (Interrupt Enable) con el cual se habilitan las interrupciones del IRQ, el bit 2 es el IRQACK (Acknowledge)que reconoce que se dio una interrupcion y el bit 4 es el IRQPE (Pin Enable) con el cual se habilita el pin del IRQ. Una forma de habilitar los bits es la siguiente: | ||
− | |||
<syntaxhighlight lang="asm"> | <syntaxhighlight lang="asm"> | ||
− | |||
LDA #$16 ; 0001 0110 | LDA #$16 ; 0001 0110 | ||
− | STA IRQSC | + | STA IRQSC |
− | + | ; IRQPDD=0, IRQEDG=0, IRQPE= 1, IRQF= 0, IRQACK=1, IRQIE= 1, IRQMOD=0 | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | |||
Siendo el IRQ una entrada, el usuario puede escoger la polaridad de los flancos o niveles detectados (IRQEDG) y si el pin detecta un flanco o un flanco y nivel (IRQMOD). Cuando el pin de IRQ es habilitado utiliza por defecto un dispositivo de pull-up o pull-down dependiendo de la polaridad escogida (IRQPDD=0). | Siendo el IRQ una entrada, el usuario puede escoger la polaridad de los flancos o niveles detectados (IRQEDG) y si el pin detecta un flanco o un flanco y nivel (IRQMOD). Cuando el pin de IRQ es habilitado utiliza por defecto un dispositivo de pull-up o pull-down dependiendo de la polaridad escogida (IRQPDD=0). | ||
− | |||
La bandera IRQF se levanta cuando se detecta el cambio en el flanco del pin IRQ esperado, y no se puede limpiar la bandera mientras el pin IRQ permanezca en este nivel. La bandera IRQF se limpia forzando IRQACK=1. | La bandera IRQF se levanta cuando se detecta el cambio en el flanco del pin IRQ esperado, y no se puede limpiar la bandera mientras el pin IRQ permanezca en este nivel. La bandera IRQF se limpia forzando IRQACK=1. | ||
− | |||
El ultimo paso para configurar IRQ se refiere al manejo del registro SCGC2 (Sistema de control de puertos de reloj 2) para controlar el puerto de reloj del IRQ. | El ultimo paso para configurar IRQ se refiere al manejo del registro SCGC2 (Sistema de control de puertos de reloj 2) para controlar el puerto de reloj del IRQ. | ||
− | |||
El IRQ corresponde al bit 5 del registro SCGC2 y se debe colocar "1" para permitir que la señal de reloj de las interrupcionde de IRQ se habilite. La manera de hacerlo es la siguiente: | El IRQ corresponde al bit 5 del registro SCGC2 y se debe colocar "1" para permitir que la señal de reloj de las interrupcionde de IRQ se habilite. La manera de hacerlo es la siguiente: | ||
− | |||
− | |||
<syntaxhighlight lang="asm"> | <syntaxhighlight lang="asm"> | ||
− | |||
LDA #$20 ; 0010 0000 | LDA #$20 ; 0010 0000 | ||
STA SCGC2 | STA SCGC2 | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | |||
− | |||
Una vez realizados estos pasos se podran realizar interrupciones por IRQ presionando el boton correspondiente a PTA5. | Una vez realizados estos pasos se podran realizar interrupciones por IRQ presionando el boton correspondiente a PTA5. | ||
Revisión del 13:07 23 mar 2013
Contenido
Introducción
El pin de IRQ se puede usar para activar interrupciones de hardware externas. Dependiendo de la configuración de la MCU, una interrupción por IRQ se genera por nivel bajo o por una transición de nivel alto a nivel bajo en el pin IRQ. Este tipo de interrupción se puede usar para supervisar sistemas externos o eventos.
Las interrupciones externas son manejadas por el registro de control y status del IRQ (IRQSC). Cuando la función del IRQ está habilitada, lógica síncrona supervisa el pin para detectar un flanco descendente o un flanco descendente y nivel bajo. Cuando el MCU está en modo stop o los relojes del sistema estén detenidos, un método asíncrono separado es usado para que el pin IRQ (si este está habilitado) pueda despertar el MCU.
Cada tipo de interrupción tiene una prioridad predefinida asociada. La interrupción del módulo IRQ externa tiene la prioridad más alta, después del evento de Reset y SWI. Cuando ocurren múltiples interrupciones, la CPU primero mira la prioridad de los eventos y servicios del evento con la prioridad más alta, con los otros pendientes.
Funcionamiento
Dependiendo de la configuración de la MCU, una interrupción por IRQ se genera por un nivel bajo o por una transición de nivel alto a un nivel bajo en el pin IRQ. Al detectarse una interrupción la bandera IRQF se coloca en 1 y se produce una petición de interrupción.
Para volver a realizar una petición de interrupción, se puede limpiar la bandera escribiendo un 1 lógico en el bit ACK del registro IRQSC. Si se limpia la bandera IRQF y se genera una nueva interrupción antes de que el pin regrese a un nivel alto, la petición de interrupción queda pendiente.
Registro IRQSC
- IRQPDD. Interrupt Request (IRQ) Pull Device Disable: Si el bit IRQPE=1, entonces este bit permite deshabilitar o habilitar los dispositivos de pull-up, dependiendo de la polaridad escogida (IRQPDD). Por default habilita los dispositivos.
- 0 Habilita los dispositivos de pull-up IRQPE=1
- 1 Deshabilita los dispositivos de pull-up IRQPE=1
- IRQEDG. Interrupt Request (IRQ) Edge Select: Este bit permite escoger los la polaridad de los flancos o niveles detectados en el pin IRQ, que causa el levantamiento de la bandera IRQF. Cuando IRQEDG=1 y se habilita el dispositivo de pull-up, este es reconfigurado como un dispositivo opcional pull-down.
- 0 el pin IRQ es sensible a un flanco descendente o un flanco descendente y nivel bajo
- 1 el pin IRQ es sensible a un flanco ascendente o un flanco ascendente y nivel alto
- IRQPE. IRQ Pin Enable: Este bit habilita la función del pin IRQ. IRQPE debe ser 1 para que el pin IRQ pueda actuar como una entrada por petición de interrupción.
- 0 Función del pin IRQ deshabilitada
- 1 Función del pin IRQ habilitada
- IRQF. IRQ Flag: Este bit indica si ha ocurrido una petición de interrupción.
- 0 No se detecto una petición por IRQ
- 1 Se detecto un evento del IRQ
- IRQACK. IRQ Acknowledge: Este bit permite limpiar la bandera IRQF si se fuerza IRQACK=1. Forzarla a 0 no tiene ningún significado o efecto. La lectura de este bit siempre retorna 0.
- IRQIE. IRQ Interrupt Enable: Este bit de control determina si los eventos del IRQ generan una petición de interrupción
- 0 Deshabilitadas las peticiones de interrupción cuando IRQF=1
- 1 Habilitadas las peticiones de interrupción cuando IRQF=1
- IRQMOD. IRQ Detection Mode: Este bit de control determina si el pin de IRQ es sensible a un único flanco o a un flanco y nivel.
- 0 sensible sólo a flancos descendentes o flacos ascendentes
- 1 sensible a flanco descendente y nivel bajo o flanco ascendente y nivel alto
Configuración del IRQ
La configuración del IRQ se hace mediante el manejo de tres registros: SOPT1, IRQSC y SCGC2.
El IRQ tiene la limitación de que posee un solo botón, el cual además comparte con RESET. Es debido a esto que el primer paso para configurar IRQ es deshabilitar el pin de RESET. El RESET pin enable (RSTPE) esta contenido en el registro SOPT1 y se configura modificando el bit 0. "1" indica que el pin esta habilitado, "0" que esta deshabilitado.
El SOPT1 es un registro de 8 bits, entre los cuales se encuentra tambien el COP (Computer Operating Properly) o watchdog, que fuerza al programa a reiniciarse si este se pierde o no se comporta como era esperado. Para evitar que el programa se reinicie el COP puede deshabilitarse colocando en "1" el bit 6 (COPT) y el bit 1 (BKGDPE) del registro SOPT1. Estos bits corresponden al COP Timeout y al Backroung Debug Mode Pin Enable respectivamente. De esta manera si se coloca:
LDA #$42 ; bits 1 y 6 en "1", bit 0 en "0"
STA SOPT1 ; $1802
Se deshabilita tanto el COP como el pin de RESET.
Configuración del pin IRQ
El siguiente paso es habilitar las interrupciones y el pin del IRQ, para esto se utiliza el registro IRQSC. El IRQPE en el registro IRQSC debe estar habilitado para que el pin IRQ pueda actuar como una entrada por petición de interrupción.
En este caso nos interesa habilitar los bits 1, 2 y 4. El bit 1 es el IRQIE (Interrupt Enable) con el cual se habilitan las interrupciones del IRQ, el bit 2 es el IRQACK (Acknowledge)que reconoce que se dio una interrupcion y el bit 4 es el IRQPE (Pin Enable) con el cual se habilita el pin del IRQ. Una forma de habilitar los bits es la siguiente:
LDA #$16 ; 0001 0110
STA IRQSC
; IRQPDD=0, IRQEDG=0, IRQPE= 1, IRQF= 0, IRQACK=1, IRQIE= 1, IRQMOD=0
Siendo el IRQ una entrada, el usuario puede escoger la polaridad de los flancos o niveles detectados (IRQEDG) y si el pin detecta un flanco o un flanco y nivel (IRQMOD). Cuando el pin de IRQ es habilitado utiliza por defecto un dispositivo de pull-up o pull-down dependiendo de la polaridad escogida (IRQPDD=0).
La bandera IRQF se levanta cuando se detecta el cambio en el flanco del pin IRQ esperado, y no se puede limpiar la bandera mientras el pin IRQ permanezca en este nivel. La bandera IRQF se limpia forzando IRQACK=1.
El ultimo paso para configurar IRQ se refiere al manejo del registro SCGC2 (Sistema de control de puertos de reloj 2) para controlar el puerto de reloj del IRQ.
El IRQ corresponde al bit 5 del registro SCGC2 y se debe colocar "1" para permitir que la señal de reloj de las interrupcionde de IRQ se habilite. La manera de hacerlo es la siguiente:
LDA #$20 ; 0010 0000
STA SCGC2
Una vez realizados estos pasos se podran realizar interrupciones por IRQ presionando el boton correspondiente a PTA5.
Jumper J18
Antes de empezar a codificar y trabajar con el pin IRQ se debe verificar que los Jumpers del DEMOQE128 posea la configuración adecuada para su funcionamiento. El pin IRQ depende de que el RESET_EN del jumper J18 este colocado de la siguiente manera:
Inicialización
Cuando se habilita por vez primera el pin de IRQ, es posible obtener una falsa bandera de interrupción. Para evitar esta falsa petición de interrupción, se debe inicializar el IRQ de la siguiente manera:
- Limpiar el IRQIE en el IRQSC
- Seleccionar la polaridad del pin forzando el bit apropiado en el IRQEDG del IRQSC
- Si se va a utilizar un dispositivo de pull-up/pull-down, limpiar el bit IRQPDD en el IRQSC
- Habilitar el pin IRQ forzando el bit apropiado en el IRQPE del IRQSC
- Colocar un 1 en el IRQACK del IRQSC para limpiar cualquier falsa interrupción
- Colocar un 1 en el IRQIE del IRQSC para habilitar las interrupciones.
BSET IRQSC_IRQPE, IRQSC ; Se habilita el pin IRQ
BSET IRQSC_IRQACK, IRQSC ; Se limpia cualquier posible falsa interrupción previa
BSET IRQSC_IRQIE, IRQSC ; Se habilitan las interrupciones del pin IRQ
Rutina de Interrupción
Primero que nada se debe buscar el vector de interrupción que contiene la dirección de la rutina que debe llamar para atender una petición de interrupción del IRQ, en el caso del MC9S08QE128 corresponde a la dirección $0000FFFA.
La interrupción del IRQ ocurre si se cumple que:
- La máscara de interrupción global está activa.
- Están habilitadas las interrupciones del IRQ
- La interrupción tiene actualmente la prioridad más alta de petición de interrupción.
Dentro de la rutina de interrupción hay que asegurarse de escribir un 1 lógico en el bit IRQACK del IRQSC para limpiar la bandera IRQF, y de esta forma permitir volver a realizar una petición de interrupción.
BSET IRQSC_IRQACK, IRQSC ; Se limpia la bandera IRQF
Ejemplo de interrupcion de IRQ
El siguiente código realiza una interrupción por IRQ sobre un programa que genera una señal diente de sierra:
;***************************************************************************************************
; Codigo para realizar una pausa sobre un
; programa para generar una onda diente de sierra utilizando el contador RTC (real time counter)
;
;****************************************************************************************************
; Include derivative-specific definitions
INCLUDE 'derivative.inc'
;
; export symbols
;
XDEF _Startup
ABSENTRY _Startup
;
; variable/data section
;
ORG RAMStart ; Insert your data definition here
contador: DS.B 1 ; Es 1 o 0 dependiendo de la parte en la que estoy con la onda cuadrada
;
; code section
;
ORG ROMStart
_Startup:
LDHX #RAMEnd+1 ; initialize the stack pointer
TXS
Main: SEI
LDA #$42 ;se carga 2 al acumulador
STA SOPT1 ;se guarda en SOPT1
; COPE = 0
; COPT = 1
; STOPE = 0
; 0
; 0
; RSTOPE= 0
; BKGDPE= 1 ;; se habilita el backroung debug mode
; RSTPE = 0 ;; se deshabilita el RESET
LDA #$00
STA contador
BSR Configurar_GPIO
BSR Configurar_RTC
;; Configuracion del IRQSC
lda #%00010110 ; se carga el numero 16 hexadecimal al acumulador
sta IRQSC ; se guarda en el registro IRQSC
; 0
; IRQPDD= 0
; IRQEDG= 0
; IRQPE = 1 ;; se habilita el IRQ pin enable
; IRQF = 0
; IRQACK= 1 ;; se habilita el ACKNOWLEDGE
; IRQIE = 1 ;; se habilita el IRQ interrupt enable
; IRQMOD= 0
CLI ; habilitar interrupciones
Fin: BRA Fin ; un BRA * tendria este mismo efecto de loop
;**************************************************************
; Subrutina de configuracion *
;**************************************************************
Configurar_GPIO:
LDA #$3F
STA PTCDD
LDA #$C0
STA PTEDD
LDA #$3F ;logica negada (Inicializamos los leds apagados)
STA PTCD
LDA #$C0
STA PTED
RTS
Configurar_RTC:
LDA #$24
STA SCGC2
LDA #$00
STA RTCMOD
LDA #$1D
STA RTCSC
RTS
;**************************************************************
;* RUTINAS DE INTERRUPCION *
;* *
;**************************************************************
rutinaIRQ:
;;SCGC2: sistema de control de puertos de reloj.
;;Este registro contiene:
; DBG
; FLS
; IRQ <-- Este el el que nos interesa para habilitar el interrupt request
; KBI
; ACMP
; RTC
; SIP2
; SIP1
BSET IRQSC_IRQACK ,IRQSC ;se limpian las banderas de interrupcion
LDA #$20 ;Se carga 0010 0000 al acumulador
CMP SCGC2 ;se verifica que IRQ este activo
BEQ Habilitar_RTC ;branch a Habilitar_RTC si RTC no esta activo
;;SI RTC ESTA HABILITADO NO HARA EL BRANCH, POR LO TANTO:
Deshabilitar_RTC:
LDA #$20 ;se carga 0010 0000 al acumulador
STA SCGC2 ;al guardarlo en SCGC2 se deshabilita RTC
;...esto detiene el programa hasta volver a entrar en la interrupcion
RTI ;retorna de la interrupción
;;SI RTC NO ESTA HABILITADO SE ENTRA EN HABILITAR RTC:
Habilitar_RTC:
LDA #$24 ;se carga el numero 0010 0100
STA SCGC2 ;se guarda en SCGC2, se habilita el RTC (Real Time Counter)
; esto hace que el programa vuelva a correr hasta volver a entrar en interrupcion
RTI ;retorna de la interrupción
;------------------------------------------------------------------------------------------------------------------
Interrupcion_RTC:
LDA #$80
ORA RTCSC
STA RTCSC
LDA contador
INCA
STA contador
LDA #$3F
AND contador
COMA
STA PTCD
LDA #$C0
AND contador
COMA
STA PTED
RTI
;**************************************************************
;* spurious - Spurious Interrupt Service Routine. *
;* (unwanted interrupt) *
;**************************************************************
spurious: ; placed here so that security value
NOP ; does not change all the time.
RTI
;**************************************************************
;* Interrupt Vectors *
;**************************************************************
ORG $FFCE
DC.W Interrupcion_RTC ;; Vector de interrupcion RTC
ORG $FFFA ; <--- IMPORTANTE RECORDAR EL VECTOR DE INTERRUPCION DE IRQ EN EL ORIGEN CORRECTO
DC.W rutinaIRQ ; ...con el nombre que se le haya dado a la rutina de interrupcion de IRQ
DC.W spurious ; SWI
DC.W _Startup ; Reset
Instrucciones Relacionadas
El Instruction Set de los Microcontroladores HCS08 contiene instrucciones directamente vinculadas con el uso del pin IRQ, como:
- BIH: Branch if IRQ Pin High. Comprueba el estado del pin de interrupción externo y realiza un salto si el pin esta en un nivel alto.
- If IRQ pin = 1, PC ← (PC) + $0002 + rel
- BIL: Branch if IRQ Pin Low. Comprueba el estado del pin de interrupción externo y realiza un salto si el pin esta en un nivel bajo.
- If IRQ pin = 0, PC ← (PC) + $0002 + rel
El registro CCR no se ve afectado por estas instrucciones.
Referencias
Contributors
Anny, Artdamato, CeMoron, LuisiVelas, MaAndreinaCane, Racuna, Vegabante