You are on page 1of 10

Interrupciones

49

4.4 Interrupciones RBI (Interrupciones por cambio de estado)


Cuatro pines del PORTB (RB7:RB4) son capaces de disparar una interrupcin por cambio de estado. Este tipo de interrupciones son comnmente usadas para el manejo de teclados matriciales, de ah que estos pines tambin los denominen KBI0:KBI3. De estos 4 pines, solo producirn interrupcin aquellos configurados como entradas, si alguno est configurado como salida, queda excluido de la interrupcin por cambio de estado. Cualquiera de estos 4 pines dispara la misma interrupcin, es decir la misma bandera de interrupcin se activa, la bandera RBIF (INTCON<0>). Para activar esta interrupcin se puede usar la funcin OpenPORTB de la librera portb.h.

Figura 4-3. Funcin para activar interrupcin RBI ([7] )

Ing. Juan Ramon Terven Salinas

Interrupciones

50

4.4.1 Teclado Matricial


Un teclado matricial est constituido por una matriz de pulsadores dispuestos en filas y columnas como se muestra en la Figura 4-4. La finalidad es reducir el nmero de lneas necesarias para la conexin. Como se observa en la figura, cada tecla se conecta a una fila y a una columna. En este caso se tiene un teclado de 4x4 en el cual se necesitan slo 8 pines del microcontrolador en lugar de 16 si fueran botones independientes. Cuando se pulsa una tecla, queda en contacto una fila con una columna. Si no hay tecla pulsada, las filas estn desconectadas de las columnas.

Figura 4-4. Teclado matricial con microcontrolador [11]

4.4.2 Conexin del Teclado matricial con el microcontrolador PIC18F4550

La Figura 4-4 muestra una posible conexin de un teclado matricial a un microcontrolador con las siguientes caractersticas:

Ing. Juan Ramon Terven Salinas

Interrupciones

51

Las filas del teclado se conectan a las lneas de la parte baja del PORTB configuradas como salida. Las columnas del teclado se conectan a las lneas de la parte alta del PORTB configuradas como entrada. Observe que estas lneas deben tener resistencias de pull-up. En el caso del PIC18F4550, todos los pines del PORTB poseen resistencias de pull-up internas que pueden ser activadas por software.

Para detectar que tecla se pulsa, se aplica a una fila un nivel bajo y a las otras filas un nivel alto. Si se presiona una tecla en la fila por la que se aplica el nivel bajo, ese nivel bajo aparecer en la columna correspondiente con la que ha hecho contacto. En la Figura 4-4 se pulsa la tecla 3, de tal forma que cuando el microcontrolador explora la fila F1, este cero aparece en la columna C3 y es ledo por el pin RB6.

4.4.3 Algoritmo para lectura del teclado


El algoritmo de lectura del teclado utilizado en este proyecto hace uso de la interrupcin RBI para detectar si se pulsa alguna tecla. Una vez que la interrupcin detecta que se pulso una tecla, el siguiente paso es determinar que tecla se pulso. 1. Primeramente a cada tecla se le asigna un cdigo que puede ser el orden de la tecla, como se muestra en la Figura 4-5.

Figura 4-5- Codigo asignado a cada tecla

Ing. Juan Ramon Terven Salinas

Interrupciones 2. Luego ejecutamos el algoritmo siguiente:


Tecla = 0 Fila1 = 0, dems filas = 1

52

SI

Columna1 = 0? NO Incrementa Tecla

SI

Columna2 = 0? NO Incrementa Tecla

SI

Columna3 = 0? NO Incrementa Tecla

SI

Columna4 = 0? NO Incrementa Tecla

ltima Tecla? SI Decodifica Tecla

NO

Siguiente Fila=0, las demas Filas en 1

Fin
Figura 4-6. Algortmo de deteccin de tecla pulsada

Ing. Juan Ramon Terven Salinas

Interrupciones A continuacin se muestra una funcin llamada leeTecla la cual implementa el algoritmo anterior en lenguaje C:
// Esta funcion obtiene la tecla pulsada del // teclado matricial y la decodifica. // Regresa el caracter ASCII que representa la tecla int leeTecla(void) { int tecla = 0; int fila = 0x0E; PORTB = fila; do { //Columna1 = 0? if(PORTBbits.RB4 == 0) break; //si tecla++; //no //Columna2 = 0? if(PORTBbits.RB5 == 0) break; tecla++; //Columna3 = 0? if(PORTBbits.RB6 == 0) break; tecla++; //Columna4 = 0? if(PORTBbits.RB7 == 0) break; tecla++; //Siguiente Fila=0, las demas Filas fila <<= 1; fila++; PORTB = fila; }while(tecla < 16); //ltima tecla? LATB = 0; // Decodifica la tecla switch(tecla) { case 0: return '7'; case 1: return '8'; case 2: return '9'; case 3: return '/'; case 4: return '4'; case 5: return '5'; case 6: return '6'; case 7: return 'X'; case 8: return '1'; case 9: return '2'; en 1

53

// Tecla = 0 // Fila1 = 0, dems filas = 1

Ing. Juan Ramon Terven Salinas

Interrupciones
case 10: return '3'; case 11: return '-'; case 12: return 'C'; case 13: return '0'; case 14: return '='; case 15: return '+'; default: return -1; } }//fin de funcin leeTecla Programa 4-4. Algoritmo de lectura del teclado, funcin leeTecla

54

En la funcin anterior, una vez terminado el ciclo do-while, en la variable tecla se tiene el nmero de tecla pulsada (de 0 a 15). Teniendo este nmero se decodifica al valor final deseado usando un switch (puede ser el que indica la serigrafa del teclado).

Ahora la idea es que cuando se pulse cualquier tecla se produzca una interrupcin RBI, para esto usamos la funcin OpenPORTB y habilitaremos las interrupciones con el bit GIE del registro INTCON. La funcin iniciaTeclado mostrada en el cdigo siguiente deja listo el microcontrolador para detectar las interrupciones RBI.

// Esta funcin Activa la interrupcin RBI y Pull-ups internas // para detectar la tecla pulsada void iniciaTeclado(void) { // Configura el nible alto de PORTB como entrada // y el nible bajo como salida TRISB = 0xF0; PORTB = 0; // Inicia PORTB para recibir interrupcion // Configura interrupcion por cambio de estado en PORTB y // activa pull-ups OpenPORTB( PORTB_CHANGE_INT_ON & PORTB_PULLUPS_ON); // Habilitacin de interrupciones INTCONbits.GIE = 1; } Programa 4-5. Funcin iniciaTeclado

La funcin setTeclado se usa para dejar listo el puerto para recibir interrupciones, esta funcin la podemos usar en caso que el teclado y el display compartan el mismo puerto, ya que las funcin del LCD modifican el puerto.

Ing. Juan Ramon Terven Salinas

Interrupciones
// Esta funcin Deja listo el puerto B para detectar una tecla pulsada // Se usa porque las funciones del LCD modifican TRISB y PORTB void setTeclado(void) { // Configura el nible alto de PORTB como entrada // y el nible bajo como salida TRISB = 0xF0; //Deja listo PORTB para producir interrupcion (salidas enviando 0) PORTB = 0; } Programa 4-6. Funcin setTeclado

55

Estas 3 funciones anteriores forman parte de un archivo llamado teclado.c el cual forma parte de una librera denominada teclado.h, cuyo contenido se muestra a continuacin:

#ifndef TECLADO_H #define TECLADO_H void iniciaTeclado(void); void setTeclado(void); int leeTecla(void); #endif Programa 4-7. teclado.h

Ing. Juan Ramon Terven Salinas

Interrupciones

56

Ejemplo 4-4. Uso de Teclado Matricial


El siguiente ejemplo demuestra el uso de un teclado matricial de 4x4 usando el algoritmo explicado anteriormente. Al pulsarse una tecla se muestra su smbolo en el LCD. El diagrama se muestra en la Figura 4-7, observe que las filas (FIL1 FIL4) se conectan a los pines RB0 RB3 y las columnas (COL1 COL4) a los pines RB4 RB7. Las columnas conectadas a los pines RB4 RB7 se usan como entradas de interrupcin (KBI0 KBI3) y las filas son son salidas del microcontrolador que envan ceros a las columnas cuando se pulsa alguna tecla del teclado matricial.

Figura 4-7. Diagrama con Teclado Matricial y LCD

El cdigo se muestra a continuacin

Ing. Juan Ramon Terven Salinas

Interrupciones
Programa 4-8. Uso de Teclado Matricial y LCD
/* Uso de Teclado Matricial y LCD */ #include <p18F4550.h> #include "lcd.h" #include "teclado.h" void Teclado_ISR(void); //Cdigo para bootloader extern void _startup (void); #pragma code REMAPPED_RESET_VECTOR = 0x1000 void _reset (void) { _asm goto _startup _endasm } // Seccion de codigo #pragma code void main() { char cad[] = "Probando Teclado"; ADCON1 = 0x0f; // Configura pines como digitales

57

// configura LCD OpenLCD(FOUR_BIT & LINES_5X7); putsLCD(cad); SetDDRamAddr(0x40); // se coloca en el renglon 2 //Inicia interrupcion RBI, pull-ups y deja listo el teclado iniciaTeclado(); while(1){} } // Vector de interrupcin #pragma code Interrupcion=0x1008 void VectorInterrupcion (void) { _asm GOTO Teclado_ISR _endasm } #pragma code // Rutina de interrupcin de teclado #pragma interrupt Teclado_ISR void Teclado_ISR(void) { int tecla; tecla = leeTecla(); while(leeTecla()!=-1); if(tecla != -1) { WriteDataLCD(tecla); // lee y decodifica la tecla pulsada //espera a que se suelte la tecla // si hay tecla valida // escribe la tecla pulsada en LCD

// deja listo el teclado para la siguiente interrupcin setTeclado(); } // Limpia la bandera de interrupcion INTCONbits.RBIF = 0; }

Ing. Juan Ramon Terven Salinas

Interrupciones

58

PRCTICA 4. Cerradura Electrnica


Disee un sistema de cerradura electrnica con contrasea de 4 dgitos. Usar un teclado matricial para digitar la contrasea. Al encender el circuito se le pedir al usuario que escriba la contrasea. Si la escribe correctamente, aparecer en el display PASSW CORRECTA y activar la chapa elctrica durante 2 segundos aproximadamente. Si la contrasea escrita es incorrecta aparecer en el display PASSW INCORRECTA Cuando se escriba la contrasea se mostrarn * en lugar del valor de la tecla pulsada.

Ing. Juan Ramon Terven Salinas

You might also like