Diferencia entre revisiones de «KBI (Keyboard interrupts) - MC9S08QE128»
(→Simulación de interrupciones mediante el uso de comandos) |
|||
(No se muestran 45 ediciones intermedias de 10 usuarios) | |||
Línea 1: | Línea 1: | ||
[[Categoría:MC9S08QE128]] | [[Categoría:MC9S08QE128]] | ||
− | |||
− | |||
− | + | <div style="top:+0.3em; text-align: center;font-size:100%; border:1px solid #C7D0F8; background:#F2F5FD;width:80%"> | |
+ | '''Este artículo está incompleto. Necesita trabajo adicional. Revisar la discusión.'''</div> | ||
− | == | + | [[Archivo:DEMOQE128+MC9S08QE128.png|300px|right|thumb|'''Demoqe128-Microcontrolador''']] |
+ | |||
+ | ==Introducción== | ||
+ | |||
+ | Ante la necesidad de introducir información externa en algunas aplicaciones, se definen puertos de acceso, que en el caso del DEMOQE128 se tiene lo que lleva por nombre Keyboard interrupts, las cuales le dan al usuario la posibilidad de proporcionar datos al sistema | ||
+ | |||
+ | El MC9S08QE128, dispone de una interfaz de teclado compuesta por dos módulos de KBI(KBI1-KBI2), los cuales tienen cada uno 8 pines de interrupción que pueden ser activados individualmente, así por cada pin se puede activar una acción. Estos pines se pueden utilizar como una interrupción, en una interrupción el flujo normal del programa se para y le da paso a una rutina aparte que luego regresa el control al programa principal. No se recomienda activar varios de estos pines a la vez ya que, el MC9S08QE128 no será capaz de saber de cual de los pines proviene la interrupción. | ||
+ | |||
+ | ==Módulo de [[interrupciones]] por teclado MC9S08QE128== | ||
===Características=== | ===Características=== | ||
− | El presente | + | El presente módulo incluye los siguientes elementos: |
− | + | * 8 pines de interrupción por teclado para cada módulo KBI (1-2) con bits de habilitación separados y uno de enmascaramiento de interrupción. | |
− | + | * Dispositivo de pull-up configurable por software en el caso de que el bit del puerto sea configurado como entrada. | |
− | + | * Sensibilidad de la interrupción programable a flanco solo o flanco y nivel. | |
− | + | * Salida desde modos de bajo consumo. | |
===Diagrama de bloques de las interrupciones por teclado=== | ===Diagrama de bloques de las interrupciones por teclado=== | ||
[[Archivo:Figura1.1.jpg|700px|center|thumb|'''Diagrama de bloques de las interrupciones por teclado''']] | [[Archivo:Figura1.1.jpg|700px|center|thumb|'''Diagrama de bloques de las interrupciones por teclado''']] | ||
+ | |||
+ | Del diagrama de bloques se observa que cualquier interrupción que se active en alguno de los pines del KBIx debe pasar por un EOR, lo que ocasiona que al activarse más de una interrupción a la vez el micro no será capaz de discernir cuál de los pines es el causante de esta. | ||
===Pasos para realizar una interrupción de teclado=== | ===Pasos para realizar una interrupción de teclado=== | ||
====Activar las interrupciones por teclado==== | ====Activar las interrupciones por teclado==== | ||
− | Para activar las interrupciones por teclado, se procede a configurar el registro de control para las interrupciones denominado KBIxSC(Donde la x se refiere al | + | Para activar las interrupciones por teclado, se procede a configurar el registro de control para las interrupciones denominado KBIxSC(Donde la x se refiere al módulo de KBI que se quiera usar). Para la configuración se usa el siguiente esquema: |
− | [[Archivo: | + | [[Archivo:KBIxSC.jpg|700px|center|thumb|'''Pines del registro de habilitación y control de interrupciones KBIxSC''']] |
Para información de como trabajar con interrupciones dirigirse al siguiente link: [[Interrupciones]] | Para información de como trabajar con interrupciones dirigirse al siguiente link: [[Interrupciones]] | ||
====Descripción de los bits==== | ====Descripción de los bits==== | ||
− | '''(7-4)''': | + | *'''(7-4)''': |
Estos bits no son utilizados, están por defecto en cero. | Estos bits no son utilizados, están por defecto en cero. | ||
− | '''(3 KBF)''': | + | *'''(3 KBF)''': |
Este Bit es el que representa la bandera de teclado, es de solo lectura, se coloca en 1 cuando existe una interrupción pendiente. | Este Bit es el que representa la bandera de teclado, es de solo lectura, se coloca en 1 cuando existe una interrupción pendiente. | ||
− | '''(2 KBACK)''': | + | *'''(2 KBACK)''': |
Este es un bit de confirmación de teclado, se basa en un bit en donde se reconoce la interrupción por teclado, escribiendo un 1 en este bit de sólo escritura, se borran los pedidos de interrupción. Al ser de solo escritura siempre se lee como 0 y el RESET lo borra. | Este es un bit de confirmación de teclado, se basa en un bit en donde se reconoce la interrupción por teclado, escribiendo un 1 en este bit de sólo escritura, se borran los pedidos de interrupción. Al ser de solo escritura siempre se lee como 0 y el RESET lo borra. | ||
− | + | *'''(1 KBIE)''': | |
− | Se basa en un bit para habilitar la recepción de interrupciones, se puede decir que es un bit de para | + | Se basa en un bit para habilitar la recepción de interrupciones, se puede decir que es un bit de para máscara. |
-Colocando este bit en 1, se evita que se produzcan pedidos de interrupciones por teclado. | -Colocando este bit en 1, se evita que se produzcan pedidos de interrupciones por teclado. | ||
-Por el contrario este bit en 0, se habilitan los pedidos de interrupciones por teclado. | -Por el contrario este bit en 0, se habilitan los pedidos de interrupciones por teclado. | ||
− | '''(0 KBIMOD)''': | + | *'''(0 KBIMOD)''': |
En este bit se configura la sensibilidad de disparo del teclado, es decir define de la forma que se recibirán las interrupciones. (Control del modo de detección). | En este bit se configura la sensibilidad de disparo del teclado, es decir define de la forma que se recibirán las interrupciones. (Control del modo de detección). | ||
Colocando '''1''' Los pedidos de interrupción por teclado se dan en flancos de bajada y nivel bajo. | Colocando '''1''' Los pedidos de interrupción por teclado se dan en flancos de bajada y nivel bajo. | ||
Línea 47: | Línea 56: | ||
Para la habilitación de los pines a utilizar como mecanismo de interrupción se usa el registro KBIxPE. En la figura siguiente se muestra como se disponen los bits para su configuración. | Para la habilitación de los pines a utilizar como mecanismo de interrupción se usa el registro KBIxPE. En la figura siguiente se muestra como se disponen los bits para su configuración. | ||
− | [[Archivo: | + | [[Archivo:KBIxPE.jpg|700px|center|thumb|'''Pines del registro de habilitación de pines KBIxPE''']] |
− | Colocando el bit respectivo en | + | Colocando el bit respectivo en 1 Se habilita el puerto a que corresponda el KBIxPE# (# se refiere al número de bit en el registro. |
− | Para saber a qué puerto se refiere cada bit se procede a ver el mapeo de pines del | + | Para saber a qué puerto se refiere cada bit se procede a ver el mapeo de pines del módulo KBIx(x=1 ó x=2). En la figuras siguiente se muestra el mapeo con los puertos. |
− | + | <br><br> | |
Módulos (Mapeo de pines): | Módulos (Mapeo de pines): | ||
− | [[Archivo: | + | [[Archivo:KBI1_Pin_Mapping.jpg |700px|center|thumb|'''Mapeo de pines para el modulo KBI1''']] |
− | [[Archivo: | + | [[Archivo:KBI2_Pin_Mapping.jpg |700px|center|thumb|'''Mapeo de pines para el modulo KBI2''']] |
NOTA: Cuando un pin es habilitado para una interrupción por teclado, a la resistencia de pull up interna le toma un tiempo en alcanzar el lógico, durante este tiempo de activación se puede presentar una interrupción por teclado falsa, por lo que en el mecanismo de inicialización es necesario incluir los siguientes pasos: | NOTA: Cuando un pin es habilitado para una interrupción por teclado, a la resistencia de pull up interna le toma un tiempo en alcanzar el lógico, durante este tiempo de activación se puede presentar una interrupción por teclado falsa, por lo que en el mecanismo de inicialización es necesario incluir los siguientes pasos: | ||
− | a) Colocar el bit1 del registro de control (KBIE)=1, deshabilitando la interrupción por teclado. | + | *a) Colocar el bit1 del registro de control (KBIE)=1, deshabilitando la interrupción por teclado. |
− | b) Activar los pines para la interrupción en el registro (KBIPE), de acuerdo a los puertos que se van a usar. | + | *b) Activar los pines para la interrupción en el registro (KBIPE), de acuerdo a los puertos que se van a usar. |
− | c) Colocar el bit2 del registro | + | *c) Colocar el bit2 del registro de control (KBACK)=0, borrando así cualquier interrupción falsa que se pueda generar. |
− | d) Colocar el bit1 del registro de control (KBIE)=0, habilitando la interrupción por teclado. | + | *d) Colocar el bit1 del registro de control (KBIE)=0, habilitando la interrupción por teclado. |
+ | <br> | ||
Implementación de la habilitación de la interrupción por teclado: | Implementación de la habilitación de la interrupción por teclado: | ||
− | + | <br><br> | |
Ejemplo: En el siguiente trozo de código se realizan las inicializaciones necesarias para utilizar los pines PTA2-PTA3 y PTD2-PTD3, para interrupción por teclado. Se hace uso de una MACRO. | Ejemplo: En el siguiente trozo de código se realizan las inicializaciones necesarias para utilizar los pines PTA2-PTA3 y PTD2-PTD3, para interrupción por teclado. Se hace uso de una MACRO. | ||
Nota: Las macros se utilizan como un procedimiento recursivo, cuando el programador necesita repetir un procedimiento constantemente se puede utilizar la definición de una macro para que el procedimiento no se haga tedioso. Lo que se hace es darle un nombre a un trozo de código que se va a repetir en el programa y lo único que se hace es llamar a la macro cada vez que se desee usar. | Nota: Las macros se utilizan como un procedimiento recursivo, cuando el programador necesita repetir un procedimiento constantemente se puede utilizar la definición de una macro para que el procedimiento no se haga tedioso. Lo que se hace es darle un nombre a un trozo de código que se va a repetir en el programa y lo único que se hace es llamar a la macro cada vez que se desee usar. | ||
− | + | <syntaxhighlight lang="asm"> | |
− | + | ||
− | < | + | |
HabilitacionKBI: MACRO | HabilitacionKBI: MACRO | ||
− | MOV #$06, KBI1SC ; Pidiendo | + | MOV #$06, KBI1SC ; Pidiendo interrupción por KBI1 |
− | MOV #$06, KBI2SC ; Pidiendo | + | MOV #$06, KBI2SC ; Pidiendo interrupción por KBI2 |
BSET KBI1SC_KBACK, KBI1SC ; Limpiando las interrupciones falsas KBI1 | BSET KBI1SC_KBACK, KBI1SC ; Limpiando las interrupciones falsas KBI1 | ||
BSET KBI2SC_KBACK, KBI2SC ; Limpiando las interrupciones falsas KBI2 | BSET KBI2SC_KBACK, KBI2SC ; Limpiando las interrupciones falsas KBI2 | ||
Línea 85: | Línea 93: | ||
MOV #$0C, KBI1PE ; Habilitando los pines PTA2 Y PTA3 como kbi | MOV #$0C, KBI1PE ; Habilitando los pines PTA2 Y PTA3 como kbi | ||
MOV #$0C, KBI2PE ; Habilitando los pines PTD2 Y PTD3 como kbi | MOV #$0C, KBI2PE ; Habilitando los pines PTD2 Y PTD3 como kbi | ||
− | MOV #$00, KBI1ES ; Pines detectan una | + | MOV #$00, KBI1ES ; Pines detectan una caída de voltaje (PTA2 Y PTA3) |
− | MOV #$00, KBI2ES ; Pines detectan una | + | MOV #$00, KBI2ES ; Pines detectan una caída de voltaje (PTD2 Y PTD3) |
− | ENDM ; | + | ENDM ; Instrucción que indica el fin de la macro. |
− | </ | + | </syntaxhighlight> |
+ | <br> | ||
El equivalente del código anterior en C: | El equivalente del código anterior en C: | ||
− | < | + | |
− | + | ||
− | KBI1SC=0x06; //Pidiendo | + | <syntaxhighlight lang="c"> |
− | KBI2SC=0x06; //Pidiendo | + | KBI1SC=0x06; //Pidiendo interrupción por KBI1 |
+ | KBI2SC=0x06; //Pidiendo interrupción por KBI2 | ||
KBI1SC_KBACK=0x01; //Limpiando interrupciones falsas KBI1 | KBI1SC_KBACK=0x01; //Limpiando interrupciones falsas KBI1 | ||
KBI2SC_KBACK=0x01; //Limpiando interrupciones falsas KBI2 | KBI2SC_KBACK=0x01; //Limpiando interrupciones falsas KBI2 | ||
Línea 101: | Línea 111: | ||
KBI1PE=0x0C; // Habilitando los pines PTA2 Y PTA3 como kbi | KBI1PE=0x0C; // Habilitando los pines PTA2 Y PTA3 como kbi | ||
KBI2PE=0x0C; // Habilitando los pines PTD2 Y PTD3 como kbi | KBI2PE=0x0C; // Habilitando los pines PTD2 Y PTD3 como kbi | ||
− | KBI1ES=0x00; // Pines detectan una | + | KBI1ES=0x00; // Pines detectan una caída de voltaje (PTA2 Y PTA3) |
− | KBI2ES=0x00; // Pines detectan una | + | KBI2ES=0x00; // Pines detectan una caída de voltaje (PTD2 Y PTD3) |
− | </ | + | </syntaxhighlight> |
+ | <br> | ||
+ | |||
===Seleccionar el flanco en que se recibirán las interrupciones=== | ===Seleccionar el flanco en que se recibirán las interrupciones=== | ||
Para seleccionar el flanco de las interrupciones, el micro-controlador tiene el siguiente registro (KBIxES). | Para seleccionar el flanco de las interrupciones, el micro-controlador tiene el siguiente registro (KBIxES). | ||
− | [[Archivo: | + | [[Archivo:KBI Interrupt Edge Select Register.jpg|700x400px|center|thumb|'''Pines del registro de selección de flanco de interrupciones KBIxES''']] |
- Cada uno de los bits de KBEDGn sirven a un doble propósito: | - Cada uno de los bits de KBEDGn sirven a un doble propósito: | ||
Seleccionar la polaridad activa de interrupción (borde), así como la selección de un dispositivo de pull-up o pull-down si está habilitado. | Seleccionar la polaridad activa de interrupción (borde), así como la selección de un dispositivo de pull-up o pull-down si está habilitado. | ||
− | 0 | + | *0 Un dispositivo de pull-up está conectado al pin asociado y detecta flanco descendente de generación de instrucciones. |
− | 1 | + | *1 Un dispositivo pull_down está conectado al pin asociada y detecta el flanco ascendente de generación de instrucciones. |
− | + | <br> | |
Rutina de interrupción: | Rutina de interrupción: | ||
Ejemplo: En el siguiente trozo de código se define una macro llamada Recolección que se basa en verificar si se ha presionado el pulsador que corresponde al PTDA2, y si el PTDA2 ha sido presionado se procede a sumar 1 a la variable Var1 y si no es pulsado no hace nada. | Ejemplo: En el siguiente trozo de código se define una macro llamada Recolección que se basa en verificar si se ha presionado el pulsador que corresponde al PTDA2, y si el PTDA2 ha sido presionado se procede a sumar 1 a la variable Var1 y si no es pulsado no hace nada. | ||
− | < | + | <syntaxhighlight lang="asm"> |
− | + | Recolección: MACRO | |
− | + | ||
BRCLR 2, PTAD, I1 ; Se comprueba si el PTAD2 ha sido pulsado | BRCLR 2, PTAD, I1 ; Se comprueba si el PTAD2 ha sido pulsado | ||
− | RTI ; Se | + | RTI ; Se terminó la recepción de datos |
I1: | I1: | ||
BCLR KBI1SC_KBIE, KBI1SC ; Deshabilitando las interrupciones de KBI1 | BCLR KBI1SC_KBIE, KBI1SC ; Deshabilitando las interrupciones de KBI1 | ||
Línea 138: | Línea 149: | ||
BSET KBI2SC_KBIE, KBI2SC ; Habilitando interrupciones KBI2 | BSET KBI2SC_KBIE, KBI2SC ; Habilitando interrupciones KBI2 | ||
ENDM | ENDM | ||
− | </ | + | </syntaxhighlight> |
− | + | <br> | |
El equivalente del código anterior en C | El equivalente del código anterior en C | ||
− | + | <syntaxhighlight lang="c"> | |
− | + | ||
− | < | + | |
− | + | ||
if(PTAD_PTAD2==0){ // Se comprueba si el PTAD2 ha sido pulsado. | if(PTAD_PTAD2==0){ // Se comprueba si el PTAD2 ha sido pulsado. | ||
KBI1SC_KBIE=0x00; // Deshabilitando las interrupciones de KBI1 | KBI1SC_KBIE=0x00; // Deshabilitando las interrupciones de KBI1 | ||
Línea 157: | Línea 165: | ||
KBI2SC_KBIE=0x01; //Habilitando interrupciones KBI2 | KBI2SC_KBIE=0x01; //Habilitando interrupciones KBI2 | ||
} | } | ||
− | </ | + | </syntaxhighlight> |
+ | |||
+ | |||
+ | == Efecto rebote == | ||
+ | |||
+ | |||
+ | El microprocesador para una persona es sumamente rápido, nosotros no somos capaces de percibir la ejecución de las instrucciones en tiempo real, por esto, cuando se habilitan las encuestas o interrupciones por teclado, puede ocurrir un fenómeno llamado rebote en el cual se acciona un botón y el micro observa varios flancos, lo que ocasiona una respuesta extraña por parte de este (o bien puede activarse varias veces sin que uno logre observarlo o parecer que no se activa). | ||
+ | |||
+ | === Rebote en interrupciones por teclado === | ||
+ | |||
+ | |||
+ | Para solucionar este problema es necesario, una vez que se activa la interrupción, colocar un tiempo de espera y luego volver a evaluar el estado de la bandera de interrupción, así se puede asegurar que los flancos ya no forman parte del accionamiento del botón anterior. Para esto se puede utilizar cualquiera de los Timers disponibles en el micro. A continuación se presentan dos ejemplos de rutinas para el tiempo de espera luego de accionar algún botón. | ||
+ | |||
+ | ==== Ejemplo con RTC ==== | ||
+ | |||
+ | Es necesario configurar el RTC para un tiempo mayor a 50ms, sin activar la interrupción de este. Para el ejemplo RTCLKS= #%00, RTCPS= #%1011. | ||
+ | |||
+ | <syntaxhighlight lang="asm"> | ||
+ | |||
+ | Reloj: | ||
+ | LDA #$06 | ||
+ | STA RTCMOD | ||
+ | |||
+ | Espera: | ||
+ | LDA RTCCNT | ||
+ | CMP RTCMOD | ||
+ | BNE Espera | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | Una vez culmina el tiempo de espera el programador puede limpiar la bandera de interrupción y salirse de esta o puede colocar la rutina reloj al principio de la interrupción, todo depende de la aplicación. | ||
+ | |||
+ | Para aumentar el rebote solo es necesario disminuir el tiempo de espera, si se considera que aún se observa rebote con ese tiempo de espera sólo es necesario incrementar el valor del módulo. | ||
+ | |||
+ | ==== Ejemplo utilizando contadores ==== | ||
+ | |||
+ | Para utilizar este segmento de código es necesario inicializar las variables cnt y cnt1. | ||
+ | |||
+ | <syntaxhighlight lang="asm"> | ||
+ | |||
+ | Reloj: | ||
+ | LDA #$00 | ||
+ | STA cnt | ||
+ | STA cnt1 | ||
+ | Espera: | ||
+ | INC cnt | ||
+ | BEQ Espera1 | ||
+ | BRA Espera | ||
+ | Espera1: | ||
+ | INC cnt1 | ||
+ | LDA #$0F | ||
+ | CBEQ cnt1, Salir | ||
+ | BRA Espera1 | ||
+ | |||
+ | Salir: | ||
+ | |||
+ | </syntaxhighlight> | ||
+ | |||
+ | Salir debe llevar al programa al flujo normal del código. | ||
+ | |||
+ | == Simulación de interrupciones por teclado == | ||
+ | |||
+ | Simular las interrupciones es posible hacerlo de dos formas: la primera gráfica y la segunda mediante el uso de comandos. | ||
+ | |||
+ | === Simulación de interrupciones mediante la forma gráfica === | ||
+ | |||
+ | Para simular una interrupción por teclado de forma gráfica, una vez que se está simulando un programa y esten habilitadas la interrupciones, se debe seleccionar arriba y a la izquierda la pestaña que dice HCS08FCS -> Port Pins Module -> Set Input Pin Levels (INPUTS). | ||
+ | |||
+ | [[Archivo:Simulación de interrupción por teclado.png|700px|center|thumb|'''Ventana del debug con pestaña de simulación de puertos de entrada expandida''']] | ||
+ | |||
+ | [[Image:Simulated Ports Inputs.png|thumb|widthpx| Cuadro para la simulación de los puertos de entrada del microprocesador]] | ||
+ | |||
+ | Aparecerá un recuadro llamado Simulated Port Inputs, en este todas las entradas aparecerán en alto, para simular la interrupción se coloca en bajo el pin deseado según el mapeo de pines del módulo del KBIx. | ||
+ | En la tabla mostrada se observa el valor que se debe introducir para simular la interrupción correcta. | ||
+ | |||
+ | {| class="wikitable" border="1" | ||
+ | |+ | ||
+ | ! Puerto que se modifica !! Valor para activar la interrupción | ||
+ | |- | ||
+ | | PTA2 || #$FB | ||
+ | |- | ||
+ | | PTA3 || #$F7 | ||
+ | |- | ||
+ | | PTD2 || #$FB | ||
+ | |- | ||
+ | | PTD3 || #$F7 | ||
+ | |} | ||
+ | |||
+ | |||
+ | Una vez que se entra en la interrupción se debe reestablecer el valor predeterminado del pin en el recuadro Simulated Port Inputs, a fin de poder accionar de nuevo la interrupción en un futuro. Recuerde que para hacer uso de estas interrupciones es necesario que primero se configuren en el programa. | ||
+ | |||
+ | === Simulación de interrupciones mediante el uso de comandos === | ||
+ | |||
+ | |||
+ | Para hacer uso de esta forma es necesario correr el programa y detenerlo cuando esten hechas la debidas configuraciones de las interrupciones y estas esten habilitadas. | ||
+ | |||
+ | Una vez que ya estan listas las configuraciones se escribe en la pantalla de comandos: | ||
+ | |||
+ | <syntaxhighlight lang="asm"> | ||
+ | |||
+ | INPUT<x> <n> | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | Donde x significa el puerto que se desea modificar y n, el número que se desea colocar en este puerto. | ||
+ | |||
+ | En el ejemplo: | ||
+ | # Se deja correr el programa y se detiene una vez se configuran todos los vectores de interrupción. | ||
+ | # Se coloca el comando para modificar el puerto a con el valor FB para activar el boton PTA2 (INPUTA FB). | ||
+ | # Se corre el programa y se observa el cambio de las banderas y la entrada en la interrupción, el nombre de la interrupción es Interrupcion_externa. | ||
+ | |||
+ | [[Image:imagen2.png|thumb|widthpx| Simulated port luego de escribir el comando]] | ||
+ | [[Image:imagen3.png|thumb|widthpx|Cambio de las banderas e interrupción luego de correr el programa]] | ||
+ | [[Archivo:imagen1.png|600px|center|thumb|'''Ventana del debug después de escribir el comando del ejemplo (INPUTA FB en azul).''']] | ||
+ | |||
+ | Al igual que en el caso anterior una vez que se modifica un puerto se debe reestablecer su valor predeterminado (#$FF) para poder volver a simular la interrupción. | ||
− | |||
==Referencias== | ==Referencias== | ||
− | http://www.freescale.com/files/microcontrollers/doc/ref_manual/MC9S08QE128RM.pdf | + | *[http://www.freescale.com/files/microcontrollers/doc/ref_manual/MC9S08QE128RM.pdf''MC9S08QE128RM Reference Manual''] |
+ | |||
+ | |||
+ | |||
+ | *[http://www.freescale.com/files/microcontrollers/doc/user_guide/DEMOQE128UM.pdf ''DEMOQE128 User Manual''] |
Revisión actual del 18:26 29 mar 2013
Contenido
- 1 Introducción
- 2 Módulo de interrupciones por teclado MC9S08QE128
- 3 Efecto rebote
- 4 Simulación de interrupciones por teclado
- 5 Referencias
Introducción
Ante la necesidad de introducir información externa en algunas aplicaciones, se definen puertos de acceso, que en el caso del DEMOQE128 se tiene lo que lleva por nombre Keyboard interrupts, las cuales le dan al usuario la posibilidad de proporcionar datos al sistema
El MC9S08QE128, dispone de una interfaz de teclado compuesta por dos módulos de KBI(KBI1-KBI2), los cuales tienen cada uno 8 pines de interrupción que pueden ser activados individualmente, así por cada pin se puede activar una acción. Estos pines se pueden utilizar como una interrupción, en una interrupción el flujo normal del programa se para y le da paso a una rutina aparte que luego regresa el control al programa principal. No se recomienda activar varios de estos pines a la vez ya que, el MC9S08QE128 no será capaz de saber de cual de los pines proviene la interrupción.
Módulo de interrupciones por teclado MC9S08QE128
Características
El presente módulo incluye los siguientes elementos:
- 8 pines de interrupción por teclado para cada módulo KBI (1-2) con bits de habilitación separados y uno de enmascaramiento de interrupción.
- Dispositivo de pull-up configurable por software en el caso de que el bit del puerto sea configurado como entrada.
- Sensibilidad de la interrupción programable a flanco solo o flanco y nivel.
- Salida desde modos de bajo consumo.
Diagrama de bloques de las interrupciones por teclado
Del diagrama de bloques se observa que cualquier interrupción que se active en alguno de los pines del KBIx debe pasar por un EOR, lo que ocasiona que al activarse más de una interrupción a la vez el micro no será capaz de discernir cuál de los pines es el causante de esta.
Pasos para realizar una interrupción de teclado
Activar las interrupciones por teclado
Para activar las interrupciones por teclado, se procede a configurar el registro de control para las interrupciones denominado KBIxSC(Donde la x se refiere al módulo de KBI que se quiera usar). Para la configuración se usa el siguiente esquema:
Para información de como trabajar con interrupciones dirigirse al siguiente link: Interrupciones
Descripción de los bits
- (7-4):
Estos bits no son utilizados, están por defecto en cero.
- (3 KBF):
Este Bit es el que representa la bandera de teclado, es de solo lectura, se coloca en 1 cuando existe una interrupción pendiente.
- (2 KBACK):
Este es un bit de confirmación de teclado, se basa en un bit en donde se reconoce la interrupción por teclado, escribiendo un 1 en este bit de sólo escritura, se borran los pedidos de interrupción. Al ser de solo escritura siempre se lee como 0 y el RESET lo borra.
- (1 KBIE):
Se basa en un bit para habilitar la recepción de interrupciones, se puede decir que es un bit de para máscara. -Colocando este bit en 1, se evita que se produzcan pedidos de interrupciones por teclado. -Por el contrario este bit en 0, se habilitan los pedidos de interrupciones por teclado.
- (0 KBIMOD):
En este bit se configura la sensibilidad de disparo del teclado, es decir define de la forma que se recibirán las interrupciones. (Control del modo de detección). Colocando 1 Los pedidos de interrupción por teclado se dan en flancos de bajada y nivel bajo. Colocando 0 Los pedidos de interrupción por teclado se dan en flancos de bajada únicamente.
Habilitación de los pines para las interrupciones
Para la habilitación de los pines a utilizar como mecanismo de interrupción se usa el registro KBIxPE. En la figura siguiente se muestra como se disponen los bits para su configuración.
Colocando el bit respectivo en 1 Se habilita el puerto a que corresponda el KBIxPE# (# se refiere al número de bit en el registro.
Para saber a qué puerto se refiere cada bit se procede a ver el mapeo de pines del módulo KBIx(x=1 ó x=2). En la figuras siguiente se muestra el mapeo con los puertos.
Módulos (Mapeo de pines):
NOTA: Cuando un pin es habilitado para una interrupción por teclado, a la resistencia de pull up interna le toma un tiempo en alcanzar el lógico, durante este tiempo de activación se puede presentar una interrupción por teclado falsa, por lo que en el mecanismo de inicialización es necesario incluir los siguientes pasos:
- a) Colocar el bit1 del registro de control (KBIE)=1, deshabilitando la interrupción por teclado.
- b) Activar los pines para la interrupción en el registro (KBIPE), de acuerdo a los puertos que se van a usar.
- c) Colocar el bit2 del registro de control (KBACK)=0, borrando así cualquier interrupción falsa que se pueda generar.
- d) Colocar el bit1 del registro de control (KBIE)=0, habilitando la interrupción por teclado.
Implementación de la habilitación de la interrupción por teclado:
Ejemplo: En el siguiente trozo de código se realizan las inicializaciones necesarias para utilizar los pines PTA2-PTA3 y PTD2-PTD3, para interrupción por teclado. Se hace uso de una MACRO.
Nota: Las macros se utilizan como un procedimiento recursivo, cuando el programador necesita repetir un procedimiento constantemente se puede utilizar la definición de una macro para que el procedimiento no se haga tedioso. Lo que se hace es darle un nombre a un trozo de código que se va a repetir en el programa y lo único que se hace es llamar a la macro cada vez que se desee usar.
HabilitacionKBI: MACRO
MOV #$06, KBI1SC ; Pidiendo interrupción por KBI1
MOV #$06, KBI2SC ; Pidiendo interrupción por KBI2
BSET KBI1SC_KBACK, KBI1SC ; Limpiando las interrupciones falsas KBI1
BSET KBI2SC_KBACK, KBI2SC ; Limpiando las interrupciones falsas KBI2
BSET KBI1SC_KBIE, KBI1SC ; Habilitando las interrupciones KBI1
BSET KBI2SC_KBIE, KBI2SC ; Habilitando interrupciones KBI2
MOV #$0C, KBI1PE ; Habilitando los pines PTA2 Y PTA3 como kbi
MOV #$0C, KBI2PE ; Habilitando los pines PTD2 Y PTD3 como kbi
MOV #$00, KBI1ES ; Pines detectan una caída de voltaje (PTA2 Y PTA3)
MOV #$00, KBI2ES ; Pines detectan una caída de voltaje (PTD2 Y PTD3)
ENDM ; Instrucción que indica el fin de la macro.
El equivalente del código anterior en C:
KBI1SC=0x06; //Pidiendo interrupción por KBI1
KBI2SC=0x06; //Pidiendo interrupción por KBI2
KBI1SC_KBACK=0x01; //Limpiando interrupciones falsas KBI1
KBI2SC_KBACK=0x01; //Limpiando interrupciones falsas KBI2
KBI1SC_KBIE=0x01; // Habilitando las interrupciones KBI1
KBI2SC_KBIE=0x01; //Habilitando interrupciones KBI2
KBI1PE=0x0C; // Habilitando los pines PTA2 Y PTA3 como kbi
KBI2PE=0x0C; // Habilitando los pines PTD2 Y PTD3 como kbi
KBI1ES=0x00; // Pines detectan una caída de voltaje (PTA2 Y PTA3)
KBI2ES=0x00; // Pines detectan una caída de voltaje (PTD2 Y PTD3)
Seleccionar el flanco en que se recibirán las interrupciones
Para seleccionar el flanco de las interrupciones, el micro-controlador tiene el siguiente registro (KBIxES).
- Cada uno de los bits de KBEDGn sirven a un doble propósito: Seleccionar la polaridad activa de interrupción (borde), así como la selección de un dispositivo de pull-up o pull-down si está habilitado.
- 0 Un dispositivo de pull-up está conectado al pin asociado y detecta flanco descendente de generación de instrucciones.
- 1 Un dispositivo pull_down está conectado al pin asociada y detecta el flanco ascendente de generación de instrucciones.
Rutina de interrupción:
Ejemplo: En el siguiente trozo de código se define una macro llamada Recolección que se basa en verificar si se ha presionado el pulsador que corresponde al PTDA2, y si el PTDA2 ha sido presionado se procede a sumar 1 a la variable Var1 y si no es pulsado no hace nada.
Recolección: MACRO
BRCLR 2, PTAD, I1 ; Se comprueba si el PTAD2 ha sido pulsado
RTI ; Se terminó la recepción de datos
I1:
BCLR KBI1SC_KBIE, KBI1SC ; Deshabilitando las interrupciones de KBI1
BCLR KBI2SC_KBIE, KBI2SC ; Deshabilitando interrupciones KBI2
LDA #$01
ADD Var1
STA Var1 ; Aumento Var1 en 1
ESPERA:
BRSET 2, PTAD, HAB ; Esperando que el PTAD2 vuelva a 1
BRA ESPERA
HAB:
BSET KBI1SC_KBIE, KBI1SC ; Habilitando las interrupciones KBI1
BSET KBI2SC_KBIE, KBI2SC ; Habilitando interrupciones KBI2
ENDM
El equivalente del código anterior en C
if(PTAD_PTAD2==0){ // Se comprueba si el PTAD2 ha sido pulsado.
KBI1SC_KBIE=0x00; // Deshabilitando las interrupciones de KBI1
KBI2SC_KBIE=0x00; //Deshabilitando interrupciones KBI2
Var1=Var1+1;
If(PTAD_PTAD2==0){ // Esperando que el PTAD2 vuelva a 1
for(; ;){
}
}
KBI1SC_KBIE=0x01; //Habilitando interrupciones KBI1
KBI2SC_KBIE=0x01; //Habilitando interrupciones KBI2
}
Efecto rebote
El microprocesador para una persona es sumamente rápido, nosotros no somos capaces de percibir la ejecución de las instrucciones en tiempo real, por esto, cuando se habilitan las encuestas o interrupciones por teclado, puede ocurrir un fenómeno llamado rebote en el cual se acciona un botón y el micro observa varios flancos, lo que ocasiona una respuesta extraña por parte de este (o bien puede activarse varias veces sin que uno logre observarlo o parecer que no se activa).
Rebote en interrupciones por teclado
Para solucionar este problema es necesario, una vez que se activa la interrupción, colocar un tiempo de espera y luego volver a evaluar el estado de la bandera de interrupción, así se puede asegurar que los flancos ya no forman parte del accionamiento del botón anterior. Para esto se puede utilizar cualquiera de los Timers disponibles en el micro. A continuación se presentan dos ejemplos de rutinas para el tiempo de espera luego de accionar algún botón.
Ejemplo con RTC
Es necesario configurar el RTC para un tiempo mayor a 50ms, sin activar la interrupción de este. Para el ejemplo RTCLKS= #%00, RTCPS= #%1011.
Reloj:
LDA #$06
STA RTCMOD
Espera:
LDA RTCCNT
CMP RTCMOD
BNE Espera
Una vez culmina el tiempo de espera el programador puede limpiar la bandera de interrupción y salirse de esta o puede colocar la rutina reloj al principio de la interrupción, todo depende de la aplicación.
Para aumentar el rebote solo es necesario disminuir el tiempo de espera, si se considera que aún se observa rebote con ese tiempo de espera sólo es necesario incrementar el valor del módulo.
Ejemplo utilizando contadores
Para utilizar este segmento de código es necesario inicializar las variables cnt y cnt1.
Reloj:
LDA #$00
STA cnt
STA cnt1
Espera:
INC cnt
BEQ Espera1
BRA Espera
Espera1:
INC cnt1
LDA #$0F
CBEQ cnt1, Salir
BRA Espera1
Salir:
Salir debe llevar al programa al flujo normal del código.
Simulación de interrupciones por teclado
Simular las interrupciones es posible hacerlo de dos formas: la primera gráfica y la segunda mediante el uso de comandos.
Simulación de interrupciones mediante la forma gráfica
Para simular una interrupción por teclado de forma gráfica, una vez que se está simulando un programa y esten habilitadas la interrupciones, se debe seleccionar arriba y a la izquierda la pestaña que dice HCS08FCS -> Port Pins Module -> Set Input Pin Levels (INPUTS).
Aparecerá un recuadro llamado Simulated Port Inputs, en este todas las entradas aparecerán en alto, para simular la interrupción se coloca en bajo el pin deseado según el mapeo de pines del módulo del KBIx. En la tabla mostrada se observa el valor que se debe introducir para simular la interrupción correcta.
Puerto que se modifica | Valor para activar la interrupción |
---|---|
PTA2 | #$FB |
PTA3 | #$F7 |
PTD2 | #$FB |
PTD3 | #$F7 |
Una vez que se entra en la interrupción se debe reestablecer el valor predeterminado del pin en el recuadro Simulated Port Inputs, a fin de poder accionar de nuevo la interrupción en un futuro. Recuerde que para hacer uso de estas interrupciones es necesario que primero se configuren en el programa.
Simulación de interrupciones mediante el uso de comandos
Para hacer uso de esta forma es necesario correr el programa y detenerlo cuando esten hechas la debidas configuraciones de las interrupciones y estas esten habilitadas.
Una vez que ya estan listas las configuraciones se escribe en la pantalla de comandos:
INPUT<x> <n>
Donde x significa el puerto que se desea modificar y n, el número que se desea colocar en este puerto.
En el ejemplo:
- Se deja correr el programa y se detiene una vez se configuran todos los vectores de interrupción.
- Se coloca el comando para modificar el puerto a con el valor FB para activar el boton PTA2 (INPUTA FB).
- Se corre el programa y se observa el cambio de las banderas y la entrada en la interrupción, el nombre de la interrupción es Interrupcion_externa.
Al igual que en el caso anterior una vez que se modifica un puerto se debe reestablecer su valor predeterminado (#$FF) para poder volver a simular la interrupción.
Referencias
Contributors
AK, Alecruz185, Dalak, Hyma, JCaceres, LitzaPinto, LuisiVelas, Minleung, Misato, Racuna