6. teclado matricial
TRANSCRIPT
-
7/29/2019 6. teclado matricial
1/30
Profesor:
Mag. Ing. Sergio Salas Arriarn
Diseo de sistemas
microprocesados
Facultad de Ingeniera Electrnica y Mecatrnica
Carrera: Ingeniera Electrnica
Semana 10:
Manejo de teclado matricial e
Interrupciones en el dsPIC30F3014
-
7/29/2019 6. teclado matricial
2/30
Facultad de Ingeniera Electrnica y Mecatrnica
Carrera: Ingeniera Electrnica
Puertos del dsPIC30F3014
Mag. Ing. Sergio Sala
-
7/29/2019 6. teclado matricial
3/30
En total se cuentan con 5 puertos
I/O
Facultad de Ingeniera Electrnica y Mecatrnica
Carrera: Ingeniera Electrnica
Mag. Ing. Sergio Sala
El Puerto B tiene 13 bits (RB0-RB12). Adems, cada uno de estos pines
puede configurarse como entrada analgica. Los pines RB6 y RB7 se utilizan
para la programacin de la memoria FLASH a travs del grabador Pickit2. Los
pines RB0-RB5 funcionan tambin como generadores
de interrupcin por cambio de estado (CNx).
El Puerto C consta de tres pines (RC13, RC14, RC15). El pin RC15 funciona
como entrada del
cristal externo. Si se utiliza una seal de reloj externa por el pin CLKI o el
oscilador interno en
reemplazo del cristal, este pin puede funcionar como puerto I/O. Los pines
RC13 y RC14 pueden operar como generadores de interrupcin por cambio de
estado (CNx) o tambin como entrada de un cristal de baja frecuencia (porejemplo, 32,768 kHz.).
El Puerto A est compuesto por un solo pin (RA11). Este pin puede ser
configurado como generador de interrupcin externa (INT0) para la deteccin
de flancos de subida de seales digitales.
El Puerto D se compone de 6 pines (RD0-RD3 y RD8-RD9). Estos pines
pueden operar tambin para los modos de Entrada de captura, Comparacinde salida y tambin para dos interrupciones externas adicionales (INT1 e
-
7/29/2019 6. teclado matricial
4/30
Configuracin de los puertos
analgicos
Facultad de Ingeniera Electrnica y Mecatrnica
Carrera: Ingeniera Electrnica
Mag. Ing. Sergio Sala
La combinacin del registro TRISB y el registro ADPCFG permite el control y operacin
tambin operan como entrada analgica. Los pines del Puerto B que se desean utilizar c
analgica deben tener sus respectivos pines del TRISB puestos a 1 lgico. Si los pines
a 0 entonces el voltaje convertido ser el nivel alto (VOH) el nivel bajo (VOL).
Cuando se lee el registro PORTB estando todos los pines configurados como entrada an
lgico detectado ser siempre 0 en cada pin.
Por defecto todos los pines del Puerto B estn configurados como entrada analgica. Si
como salida digital, no habr ningn conflicto. Pero, si se quiere utilizar los pines del Pueentrada digital es necesario poner cada bit respectivo del registro ADPCFG a 1 lgico.
si TRISB = 0xFFFF y ADPCFG = 0x00FF, entonces los pines RB12-RB8 funcionan como
mientras que los pines RB7-RB0 operan como entrada digital.
-
7/29/2019 6. teclado matricial
5/30
Los registros PORTx y LATx
Mag. Ing. Sergio Sala
Facultad de Ingeniera Electrnica y Mecatrnica
Carrera: Ingeniera Electrnica
Los registros LATx han sido incorpo
para solucionar los problemas de ge
las instrucciones que leen y modific
las puertas de entrada y salida.Cualquier escritura sobre el registro
LATx o PORTx genera que dicho val
se muestre en el Puerto.
Si se configura el puerto como entra
Y se lee el registro PORTx entonces
Leer el valor introducido en dicho pSi se lee el registro LATx se obtendr
valor del LATCH el cual NO es simil
al valor del puerto.
-
7/29/2019 6. teclado matricial
6/30
Ejemplo de configuracin de
puertos
Mag. Ing. Sergio Sala
Facultad de Ingeniera Electrnica y Mecatrnica
Carrera: Ingeniera Electrnica
int main()
{
/*Al iniciar el programa todos los pines son entrada por defecto*/
TRISB = 0x0000; /*El Puerto B tiene 13 bits se configurantodos como salida*/
LATB = 0x1CA5; /*Acceso al Puerto B a travs del registro
LATCH*/
PORTB = 0x1CA6; /*Acceso directo al Puerto B*/
LATB++; /*Cualquier manipulacin del valor del Puerto B debe
realizarse sobre el registro LATCH*/
LATB++; /*LATB = LATB + 1*/
while(1);
return(0);
-
7/29/2019 6. teclado matricial
7/30
El teclado matricialFacultad de Ingeniera Electrnica y MecatrnicaCarrera: Ingeniera Electrnica
Mag. Ing. Sergio Sala
-
7/29/2019 6. teclado matricial
8/30
Facultad de Ingeniera Electrnica y Mecatrnica
Carrera: Ingeniera Electrnica
Mag. Ing. Sergio Sala
Las resistencias de Pull up de los
pines CNx
RB0/CN2
5V
RB1/CN3
RB2/CN4
RB3/CN5
RB4/CN6
RB5/CN7
RC14/CN0
RC13/CN1
El bit respectivo del registro
CNPU1 permite activar lasprimeras 8 resistencias de Pull up
de los pines CN0-CN7.
Con este bit a 1 se habilitan los
Pull ups internos de los pines CN0-
CN7.Con este bit a 0 las resistencias
CNPU1 = 0b0000000011111111
dsPIC30F3014Una resistencia de Pull up permite
fijar una
tensin de 5V en un pin de entrada
cuando
este se encuentra desconectado.Esto es
ideal para la conexin de
pulsadores en los
cuales se hace contacto con tierra.
-
7/29/2019 6. teclado matricial
9/30
Facultad de Ingeniera Electrnica y Mecatrnica
Carrera: Ingeniera Electrnica
Algoritmo de lectura del teclado usando
los pines CN0-CN7 (Inicio)
Mag. Ing. Sergio Sala
RB1
RB2
RB3
RB0
RB4RB5RC13RC14
0V 0V 0V 0V
1
1
1
1
Salidas digitales
En
tradas
digitales
5V
-
7/29/2019 6. teclado matricial
10/30Mag. Ing. Sergio Sala
Facultad de Ingeniera Electrnica y Mecatrnica
Carrera: Ingeniera Electrnica
Algoritmo de lectura del teclado usando
los pines CN0-CN7 (Segunda parte)
RB1
RB2
RB3
RB0
RB4RB5RC13RC14
0V 0V 0V 0V
1
0
1
1
Salidas digitales
En
tradas
digitales
5V
Se pulsa la
tecla 4
-
7/29/2019 6. teclado matricial
11/30Mag. Ing. Sergio Sala
Facultad de Ingeniera Electrnica y Mecatrnica
Carrera: Ingeniera Electrnica
Algoritmo de lectura del teclado usando
los pines CN0-CN7 (Tercera parte)
RB1
RB2
RB3
RB0
0V 1 1 1
0
0
0
0
Entradas digitales con pull up activoRB4RB5RC13RC14
Se pulsa la
tecla 4
5V
5V
Salidas
digitales
-
7/29/2019 6. teclado matricial
12/30
Facultad de Ingeniera Electrnica y Mecatrnica
Carrera: Ingeniera Electrnica
Mag. Ing. Sergio Sala
Algoritmo de lectura del teclado usando
los pines CN0-CN7 (Parte final)
Dado que primero, el 0 lgico fue detectado en el pin RB2 y el segundo 0 lgico fue
detectado en el pin RC14, la interseccin da Fila 2 y Columna 1. Eso implica la
posicin 0x04 y coincidentemente la tecla 4.
Posteriormente, se deben ignorar los Glitches producidos por el efecto de soltar la
tecla pulsada. Para esto se debe realizar un retardo de tiempo de alrededor de 200
mseg. De no realizarse este retardo se corre el riesgo de detectar ms de una
pulsacin.
Finalmente, se configuran nuevamente los pines RB5-RB2 como como salidasdigitales con el estado 0 lgico y los pines RB1, RB0, RC13 y RC14 como entradas
con Pull up activo. Y el proceso de espera de
la pulsacin de la siguiente tecla se repite.
-
7/29/2019 6. teclado matricial
13/30
Algoritmo de deteccin de las teclas pulsadas
(parte 1)
Facultad de Ingeniera Electrnica y Mecatrnica
Carrera: Ingeniera Electrnica
Mag. Ing. Sergio Sala
typedef union{
struct{
unsigned char bit0:1;
unsigned char bit1:1;
unsigned char bit2:1;unsigned char bit3:1;
unsigned char bit4:1;
unsigned char bit5:1;
unsigned char bit6:1;
unsigned char bit7:1;
}_bits;
unsigned char _byte;
}teclado;
unsigned char LeeTeclado(void);
unsigned char k;
-
7/29/2019 6. teclado matricial
14/30
Facultad de Ingeniera Electrnica y Mecatrnica
Carrera: Ingeniera Electrnica
Mag. Ing. Sergio Sala
Algoritmo de deteccin de las teclas pulsadas
(parte 2)int main(){
TRISB = 0xFFF0; //Los cuatro pines menos significativos son sal
TRISC = 0xFFFF; //RC13 y RC14 son CN0 y CN1
ADPCFG = 0xFFFF;
LCD_CONFIG();BORRAR_LCD();
ESCRIBE_MENSAJE("Prueba",6);
LATB=0;
CNPU1 = 0x00FF;
while(1)
{
k = LeeTeclado();
POS_CURSOR(1,7);
if(k!='N') ESCRIBE_CHAR(k);
}
return(0);
}
-
7/29/2019 6. teclado matricial
15/30
Mag. Ing. Sergio Sala
Facultad de Ingeniera Electrnica y Mecatrnica
Carrera: Ingeniera ElectrnicaAlgoritmo de deteccin de las teclas pulsadas (parte
3)unsigned char LeeTeclado(void)
{
teclado a;
a._bits.bit0 = PORTCbits.RC14;
a._bits.bit1 = PORTCbits.RC13;
a._bits.bit2 = PORTBbits.RB5;
a._bits.bit3 = PORTBbits.RB4;
if(a._byte == 0b00001111)return('N');
else if(a._byte == 0b00000111)
{
//COL 4
TRISB &= 0xFF0F;
TRISB |= 0x000F;
TRISC = 0x0FFF;
LATB = 0;
LATC = 0;
CNPU1 = 0x00FF;
a._bits.bit0 = PORTBbits.RB0;
a._bits.bit1 = PORTBbits.RB1;
a._bits.bit2 = PORTBbits.RB2;
a._bits.bit3 = PORTBbits.RB3;
__delay_ms(200);
-
7/29/2019 6. teclado matricial
16/30
Facultad de Ingeniera Electrnica y Mecatrnica
Carrera: Ingeniera Electrnica
Mag. Ing. Sergio Sala
Algoritmo de deteccin de las teclas pulsadas (parte
4)
if(a._byte == 0b00000111)
{TRISB &= 0xFFF0;TRISB |= 0x00F0;TRISC = 0xFFFF;LATB = 0;return('A');}
else if(a._byte == 0b00001011)
{TRISB &= 0xFFF0;TRISB |= 0x00F0;TRISC = 0xFFFF;LATB = 0;return('B');}
else if(a._byte == 0b00001101)
{TRISB &= 0xFFF0;TRISB |= 0x00F0;TRISC = 0xFFFF;LATB = 0;return('C');}else if(a._byte == 0b00001110)
{TRISB &= 0xFFF0;TRISB |= 0x00F0;TRISC = 0xFFFF;LATB = 0;return('D');}
else
{TRISB &= 0xFFF0;TRISB |= 0x00F0;TRISC = 0xFFFF;LATB = 0;return('M');}
}
else if(a._byte == 0b00001011)
{ //COL3TRISB &= 0xFF0F;
TRISB |= 0x000F;
TRISC = 0x0FFF;
LATB = 0;
LATC = 0;
CNPU1 = 0x00FF;
-
7/29/2019 6. teclado matricial
17/30
Facultad de Ingeniera Electrnica y Mecatrnica
Carrera: Ingeniera Electrnica
Mag. Ing. Sergio Sala
a._bits.bit0 = PORTBbits.RB0;
a._bits.bit1 = PORTBbits.RB1;
a._bits.bit2 = PORTBbits.RB2;
a._bits.bit3 = PORTBbits.RB3;
__delay_ms(200);
if(a._byte == 0b00000111)
{TRISB &= 0xFFF0;TRISB |= 0x00F0;TRISC = 0xFFFF;LATB = 0;return('3');}
else if(a._byte == 0b00001011)
{TRISB &= 0xFFF0;TRISB |= 0x00F0;TRISC = 0xFFFF;LATB = 0;return('6');}else if(a._byte == 0b00001101)
{TRISB &= 0xFFF0;TRISB |= 0x00F0;TRISC = 0xFFFF;LATB = 0;return('9');}
else if(a._byte == 0b00001110)
{TRISB &= 0xFFF0;TRISB |= 0x00F0;TRISC = 0xFFFF;LATB = 0;return('#');}
else
{TRISB &= 0xFFF0;TRISB |= 0x00F0;TRISC = 0xFFFF;LATB = 0;return('M');}
}
else if(a._byte == 0b00001101)
{ //COL2
TRISB &= 0xFF0F;
TRISB |= 0x000F;
TRISC = 0x0FFF;
LATB = 0;
LATC = 0;
CNPU1 = 0x00FF;
Algoritmo de deteccin de las teclas pulsadas (parte
5)
-
7/29/2019 6. teclado matricial
18/30
Facultad de Ingeniera Electrnica y Mecatrnica
Carrera: Ingeniera Electrnica
Mag. Ing. Sergio Sala
a._bits.bit0 = PORTBbits.RB0;a._bits.bit1 = PORTBbits.RB1;
a._bits.bit2 = PORTBbits.RB2;
a._bits.bit3 = PORTBbits.RB3;
__delay_ms(200);
if(a._byte == 0b00000111)
{TRISB &= 0xFFF0;TRISB |= 0x00F0;TRISC = 0xFFFF;LATB = 0;return('2');}
else if(a._byte == 0b00001011)
{TRISB &= 0xFFF0;TRISB |= 0x00F0;TRISC = 0xFFFF;LATB = 0;return('5');}else if(a._byte == 0b00001101)
{TRISB &= 0xFFF0;TRISB |= 0x00F0;TRISC = 0xFFFF;LATB = 0;return('8');}
else if(a._byte == 0b00001110)
{TRISB &= 0xFFF0;TRISB |= 0x00F0;TRISC = 0xFFFF;LATB = 0;return('0');}
else
{TRISB &= 0xFFF0;TRISB |= 0x00F0;TRISC = 0xFFFF;LATB = 0;return('M');}
}else if(a._byte == 0b00001110)
{ //COL1
TRISB &= 0xFF0F;
TRISB |= 0x000F;
TRISC = 0x0FFF;
LATB = 0;
LATC = 0;
CNPU1 = 0x00FF;
Algoritmo de deteccin de las teclas pulsadas (parte
6)
-
7/29/2019 6. teclado matricial
19/30
Facultad de Ingeniera Electrnica y Mecatrnica
Carrera: Ingeniera Electrnica
Mag. Ing. Sergio Sala
Algoritmo de deteccin de las teclas pulsadas (parte
7)
a._bits.bit0 = PORTBbits.RB0;a._bits.bit1 = PORTBbits.RB1;
a._bits.bit2 = PORTBbits.RB2;
a._bits.bit3 = PORTBbits.RB3;
__delay_ms(200);
if(a._byte == 0b00000111)
{TRISB &= 0xFFF0;TRISB |= 0x00F0;TRISC = 0xFFFF;LATB = 0;retuelse if(a._byte == 0b00001011)
{TRISB &= 0xFFF0;TRISB |= 0x00F0;TRISC = 0xFFFF;LATB = 0;retu
else if(a._byte == 0b00001101)
{TRISB &= 0xFFF0;TRISB |= 0x00F0;TRISC = 0xFFFF;LATB = 0;retu
else if(a._byte == 0b00001110)
{TRISB &= 0xFFF0;TRISB |= 0x00F0;TRISC = 0xFFFF;LATB = 0;retuelse
{TRISB &= 0xFFF0;TRISB |= 0x00F0;TRISC = 0xFFFF;LATB = 0;retu
}
else
return('N');
}
-
7/29/2019 6. teclado matricial
20/30
Las InterrupcionesFacultad de Ingeniera Electrnica y MecatrnicaCarrera: Ingeniera Electrnica
Mag. Ing. Sergio Sala
En el mundo de los microcontroladores, es muy comn implementar programas multit
encuentran pendientes de mltiples procesos: lectura de un dato proveniente del ADC,un byte por el puerto serie UART, pulsacin de una tecla del teclado matricial, un flanc
un sensor digital, el desbordamiento de un Timer, un evento de Reset, etc.
Muchos de estos eventos son procesos no predecibles que pueden ocurrir en cualquie
Si el procesador se encuentra siempre pendiente de que cualquiera de estos eventos
suceder ciertos problemas:
1. El consumo de energa aumenta.
2. El procesador puede perder un evento por no registrarlo a tiempo.
3. Si dos eventos ocurren en simultneo el procesador puede ignorar uno
de ellos.
4. El procesador puede verse limitado en su capacidad de procesamientoal tener que sostener tantos procesos a la vez.
Para evitar todos estos inconvenientes, los microcontroladores cuentan con un sistem
que permite detectar eventos externos al procesador en los momentos que ocurren y
procesador con tareas en el instante que dicho evento ha sido generado.
-
7/29/2019 6. teclado matricial
21/30
El concepto de una interrupcin
Facultad de Ingeniera Electrnica y Mecatrnica
Carrera: Ingeniera Electrnica
Mag. Ing. Sergio Sala
Telfono con la
bocina malogradaTimbre malogrado
Hombre trabajando en la programacin de
un microcontrolador dsPIC30F3014. (Tarea
Principal)
-
7/29/2019 6. teclado matricial
22/30
Facultad de Ingeniera Electrnica y Mecatrnica
Carrera: Ingeniera Electrnica
Mag. Ing. Sergio Sala
La prioridad de una interrupcin
Telfono con la
bocina malogradaTimbre malogrado
Hombre trabajando en la programacin de
un microcontrolador dsPIC30F3014. (Tarea
Principal)
Qu sucede si el telfono y el timbre suenan al mismo tiem
A quin se atiende primero?
Prioridad 7 (mayor)
Prioridad 5 (menor)
-
7/29/2019 6. teclado matricial
23/30
Facultad de Ingeniera Electrnica y Mecatrnica
Carrera: Ingeniera Electrnica
Mag. Ing. Sergio Sala
Posibles causas de interrupcin en el
dsPIC30F3014
Interrupcin externa 0 (INT0).
Entrada de captura 1 (IC1).
Comparacin de salida 1 (OC1).
Timer 1.
Entrada de captura 2 (IC2).
Comparacin de salida 2 (OC2).
Timer 2.
Timer 3.
SPI1 Receptor del UART 1.
Transmisor del UART 1.
Fin de conversin del ADC.
Escritura de la FLASH finalizada (NVM).
Interrupcin modo esclavo I2C.
Interrupcin modo maestro I2C.
Interrupcin por cambio de estado (CNx).
Interrupcin externa 1 (INT1).
Interrupcin externa 2 (INT2).
Receptor del UART 2.
Transmisor del UART 2.
Bus CAN.
Deteccin de bajo voltaje (LVD).
Interrupciones reservadas.
-
7/29/2019 6. teclado matricial
24/30
Facultad de Ingeniera Electrnica y Mecatrnica
Carrera: Ingeniera Electrnica
Mag. Ing. Sergio Sala
Tabla de interrupciones del
dsPIC30F3014
El nmero de interrupcin (INT Number) especifica la prionatural de la interrupcin. Mientras menor sea este nme
alta ser la prioridad.
El nmero de vector es el identificador de la interrupcin
de vector de interrupciones (IVT).
Los vectores de interrupciones se encuentran en la mem
a partir de la direccin 0x000014.
Cuando un evento de interrupcin ocurre, el Puntero de p
(PC) salta a la direccin respectiva del vector de interrup
La direccin de dicho vector se debe encontrar la instruccRUT_INT_XX, donde XX es el nombre asociado a la inte
especfica de dicho vector.
El salto a la rutina de interrupcin toma cuatro ciclos de r
ocurre para salir de la interrupcin y regresar al punto do
PC se haba quedado.
-
7/29/2019 6. teclado matricial
25/30
Facultad de Ingeniera Electrnica y Mecatrnica
Carrera: Ingeniera Electrnica
Mag. Ing. Sergio Sala
Banderas de interrupcin
Los registros IFSx contienen las banderas de las diversas interrupciones del dsPIC30F
automticamente se ponen a 1 lgico para indicar que una interrupcin ha ocurrido. U
la interrupcin esta bandera debe ser puesta a 0 lgico por Firmware, ya que de no h
interrupcin ser considerada no atendida por el CPU y esta se volver a ejecutar.
Por ejemplo, para borrar la bandera de interrupcin por el TIMER 1 se puede realizar l
asignacin al registro IFS0:
IFS0bits.T1IF = 0;
-
7/29/2019 6. teclado matricial
26/30
Facultad de Ingeniera Electrnica y Mecatrnica
Carrera: Ingeniera Electrnica
Mag. Ing. Sergio Sala
Los registros habilitadores de
interrupciones
Los registros IECx permiten habilitar las respectivas interrupciones del CPU. Una vez p
el respectivo bit, la interrupcin queda activa y es posible que un evento la dispare. Estnormalmente se habilitan una sola vez en el programa, a menos que el programador de
interrupcin a raz de otro evento.
Para habilitar la interrupcin por el Timer 1 se hace la siguiente asignacin al registro IE
IEC0bits.T1IE = 1;
-
7/29/2019 6. teclado matricial
27/30
Facultad de Ingeniera Electrnica y Mecatrnica
Carrera: Ingeniera Electrnica
Mag. Ing. Sergio Sala
Los registros de configuracin de
prioridad de interrupcin
Si se van a utilizar unas cuantas interrupciones del dsPIC es posible reasignar las prio
interrupciones y evitar as la prioridad por defecto dada por la tabla IVT. Solo es posibl
prioridades donde el valor de 7 es la mxima prioridad. Para esto se cuenta con los recontienen un conjunto de 3 bits para asignar la prioridad a cada tipo de interrupcin.
Por ejemplo, para que el Timer 1 tenga prioridad 3 se tiene que ejecutar la siguiente in
IPC0 = IPC0 | 0x3000;
-
7/29/2019 6. teclado matricial
28/30
Facultad de Ingeniera Electrnica y Mecatrnica
Carrera: Ingeniera Electrnica
Mag. Ing. Sergio Sala
La rutina de interrupcin
La rutina de interrupcin es una funcin que tiene un tipo especial de declaracin:
void __attribute__((__interrupt__))
Este tipo de declaracin implica que la funcin es de interrupcin y es llamada automti
eventos que generan que la bandera de interrupcin sea 1 lgico. Esta funcin no reci
parmetros.
El nombre de la rutina de interrupcin corresponde al vector asignado en la IVT. Este va
Las libreras de cabecera del proyecto. El nombre del vector tiene la siguiente nomencla
_(identificador de la interrupcin)interrupt.
Por ejemplo, la rutina de interrupcin para el Timer 1 tiene el siguiente nombre:
void __attribute__((__interrupt__)) _T1Interrupt(void)
-
7/29/2019 6. teclado matricial
29/30
Facultad de Ingeniera Electrnica y Mecatrnica
Carrera: Ingeniera Electrnica
Mag. Ing. Sergio Sala
La interrupcin INT0
El pin RA11 puede funcionar como generador de interrupcin externa por flanco de baj
seal cuadrada. Cada vez que se detecta un flanco de bajada en esta seal se dispar
(INT0)
dsPIC30F3014
RA11
INT 1 INT 2
-
7/29/2019 6. teclado matricial
30/30
Facultad de Ingeniera Electrnica y Mecatrnica
Carrera: Ingeniera Electrnica
Mag Ing Sergio Sala
Programa de manejo de la INT0int main()
{
TRISB = 0xFF00; //Los cuatro pines menos
significativos son salida
ADPCFG = 0xFFFF;
TRISAbits.TRISA11 = 1;LATB = 0;
IFS0bits.INT0IF = 0;
IPC0 = IPC0 | 0x0001; //Prioridad 1
IEC0bits.INT0IE = 1;
while(1);
return(0);}
void __attribute__((__interrupt__)) _INT0Interrupt(void){
LATB++;
__delay_ms(100);
IFS0bits INT0IF = 0;