Diferencia entre revisiones de «KBI (Keyboard interrupts) - MC9S08QE128»

De Wikitronica
Saltar a: navegación, buscar
Línea 88: Línea 88:
  
 
El equivalente del código anterior en C:  
 
El equivalente del código anterior en C:  
'''void HabilitacionKBI(void){
+
'''
 
            KBI1SC=0x06;        //Pidiendo interrupcion por KBI1
 
            KBI1SC=0x06;        //Pidiendo interrupcion por KBI1
 
                             KBI2SC=0x06;          //Pidiendo interrupcion por KBI2
 
                             KBI2SC=0x06;          //Pidiendo interrupcion por KBI2
Línea 99: Línea 99:
 
                             KBI1ES=0x00;          // Pines detectan una caida de voltaje (PTA2 Y PTA3)
 
                             KBI1ES=0x00;          // Pines detectan una caida de voltaje (PTA2 Y PTA3)
 
                             KBI2ES=0x00;          // Pines detectan una caida de voltaje (PTD2 Y PTD3)
 
                             KBI2ES=0x00;          // Pines detectan una caida de voltaje (PTD2 Y PTD3)
                }   
+
       
  
 
'''
 
'''
Línea 121: Línea 121:
 
             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 termino la recepcion de datos
 
             RTI                      ; Se termino la recepcion de datos
I1:  
+
            I1:  
 
             BCLR KBI1SC_KBIE, KBI1SC              ; Deshabilitando las interrupciones de KBI1
 
             BCLR KBI1SC_KBIE, KBI1SC              ; Deshabilitando las interrupciones de KBI1
 
             BCLR KBI2SC_KBIE, KBI2SC              ; Deshabilitando interrupciones KBI2  
 
             BCLR KBI2SC_KBIE, KBI2SC              ; Deshabilitando interrupciones KBI2  
Línea 129: Línea 129:
 
             ESPERA:    BRSET 2, PTAD, HAB          ; Esperando que el PTAD2 vuelva a 1  
 
             ESPERA:    BRSET 2, PTAD, HAB          ; Esperando que el PTAD2 vuelva a 1  
 
             BRA ESPERA
 
             BRA ESPERA
HAB:  
+
            HAB:  
 
             BSET KBI1SC_KBIE, KBI1SC              ; Habilitando las interrupciones KBI1  
 
             BSET KBI1SC_KBIE, KBI1SC              ; Habilitando las interrupciones KBI1  
 
             BSET KBI2SC_KBIE, KBI2SC              ; Habilitando interrupciones KBI2     
 
             BSET KBI2SC_KBIE, KBI2SC              ; Habilitando interrupciones KBI2     

Revisión del 23:03 16 nov 2012


Introduccion

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 a través de pulsadores mecánicos que se encuentran en el hardware de la tarjeta del microcontrolador.

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.

Modulo de interrupciones por teclado MC9S08QE128

Características

El presente modulo incluye los siguientes elementos: • 8 pines de interrupción por teclado para cada modulo 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

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 modulo de KBI que se quiera usar). Para la configuración se usa el siguiente esquema:

Archivo:Figura2.2.jpg
Pines del registro de habilitación y control de interrupciones KBIxSC

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 mascara. -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). 1 Los pedidos de interrupción por teclado se dan en flancos de bajada y nivel bajo. 2 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.

Archivo:Figura3.3.jpg
Pines del registro de habilitación de pines KBIxPE


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 modulo KBIx(x=1 ó x=2). En la figuras siguiente se muestra el mapeo con los puertos.

Módulos (Mapeo de pines):

Archivo:Figura4.4.jpg
Mapeo de pines para el modulo KBI1


Archivo:Figura5.5.jpg
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: 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 d 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 interrupcion por KBI1
           MOV #$06, KBI2SC        		  ; Pidiendo interrupcion 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 caida de voltaje (PTA2 Y PTA3)
           MOV #$00, KBI2ES        		  ; Pines detectan una caida de voltaje (PTD2 Y PTD3)
           ENDM  				  ; Instruccion que indica el fin de la macro.

El equivalente del código anterior en C: KBI1SC=0x06; //Pidiendo interrupcion por KBI1

                            KBI2SC=0x06;          //Pidiendo interrupcion por KBI2
           		     KBI1SC_KBACK=0x01;	   //Clear interrupciones falsas KBI1
                            KBI2SC_KBACK=0x01;	   //Clear 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 caida de voltaje (PTA2 Y PTA3)
                            KBI2ES=0x00;          // Pines detectan una caida 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).

Archivo:Figura6.6.jpg
Pines del registro de selección de flanco de interrupciones 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.

Recoleccion: MACRO

           BRCLR 2, PTAD, I1	                   ; Se comprueba si el PTAD2 ha sido pulsado	
           RTI                     		   ; Se termino la recepcion 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

 }	


Referencias

http://www.freescale.com/files/microcontrollers/doc/ref_manual/MC9S08QE128RM.pdf