You are on page 1of 30

Facultad de Ingeniera Electrnica y Mecatrnica Carrera: Ingeniera Electrnica

Diseo de sistemas microprocesados


Semana 10: Manejo de teclado matricial e Interrupciones en el dsPIC30F3014
Profesor: Mag. Ing. Sergio Salas Arriarn

Facultad de Ingeniera Electrnica y Mecatrnica Carrera: Ingeniera Electrnica

Puertos del dsPIC30F3014

Mag. Ing. Sergio Salas

Facultad de Ingeniera Electrnica y Mecatrnica Carrera: Ingeniera Electrnica

En total se cuentan con 5 puertos I/O

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 (por ejemplo, 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, Comparacin Mag. Ing.e Sergio Salas de salida y tambin para dos interrupciones externas adicionales (INT1

Facultad de Ingeniera Electrnica y Mecatrnica Carrera: Ingeniera Electrnica

Configuracin de los puertos analgicos

La combinacin del registro TRISB y el registro ADPCFG permite el control y operacin d tambin operan como entrada analgica. Los pines del Puerto B que se desean utilizar co analgica deben tener sus respectivos pines del TRISB puestos a 1 lgico. Si los pines d 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 e como salida digital, no habr ningn conflicto. Pero, si se quiere utilizar los pines del Puer entrada digital es necesario poner cada bit respectivo del registro ADPCFG a 1 lgico. P si TRISB = 0xFFFF y ADPCFG = 0x00FF, entonces los pines RB12-RB8 funcionan como mientras que los pines RB7-RB0 operan como entrada digital.

Mag. Ing. Sergio Salas

Facultad de Ingeniera Electrnica y Mecatrnica Carrera: Ingeniera Electrnica

Los registros PORTx y LATx

Los registros LATx han sido incorpor para solucionar los problemas de gen las instrucciones que leen y modifica 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 entrad Y se lee el registro PORTx entonces, Leer el valor introducido en dicho pu Si se lee el registro LATx se obtendr valor del LATCH el cual NO es simila al valor del puerto.

Mag. Ing. Sergio Salas

Facultad de Ingeniera Electrnica y Mecatrnica Carrera: Ingeniera Electrnica

Ejemplo de configuracin de puertos

int main() { /*Al iniciar el programa todos los pines son entrada por defecto*/
TRISB = 0x0000; /*El Puerto B tiene 13 bits se configuran todos como salida*/ LATB = 0x1CA5; /*Acceso al Puerto B a travs del registro LATCH*/ PORTB = 0x1CA6; /*Acceso directo al Puerto B*/

LATB++; realizarse LATB++;


while(1); return(0);

/*Cualquier manipulacin del valor del Puerto B debe sobre el registro LATCH*/ /*LATB = LATB + 1*/

Mag. Ing. Sergio Salas

Facultad de Ingeniera Electrnica y Mecatrnica Carrera: Ingeniera Electrnica

El teclado matricial

Mag. Ing. Sergio Salas

Facultad de Ingeniera Electrnica y Mecatrnica Carrera: Ingeniera Electrnica

Las resistencias de Pull up de los pines CNx


RC13/CN1

dsPIC30F3014

5V

Una resistencia de Pull up permite RC14/CN0 fijar una tensin de 5V en un pin de entrada RB5/CN7 cuando este se encuentra desconectado. Esto es RB4/CN6 ideal para la conexin de CNPU1 = 0b0000000011111111 pulsadores en los RB3/CN5 cuales se hace contacto con tierra. El bit respectivo del registro CNPU1 permite activar las RB2/CN4 primeras 8 resistencias de Pull up de los pines CN0-CN7. RB1/CN3 Con este bit a 1 se habilitan los Pull ups internos de los pines CN0RB0/CN2 CN7. Mag. Ing. Sergio Sala Con este bit a 0 las resistencias

Facultad de Ingeniera Electrnica y Mecatrnica Carrera: Ingeniera Electrnica

Algoritmo de lectura del teclado usando los pines CN0-CN7 (Inicio)


5V 1 1 1 1
Entradas digitales

RB3 RB2

RB1
RB0

0V 0V 0V 0V RC14RC13RB5 RB4
Salidas digitales

Mag. Ing. Sergio Salas

Facultad de Ingeniera Electrnica y Mecatrnica Carrera: Ingeniera Electrnica

Algoritmo de lectura del teclado usando los pines CN0-CN7 (Segunda parte)
5V 1 0 1 1
Entradas digitales

Se pulsa la tecla 4

RB3 RB2

RB1
RB0

0V 0V 0V 0V RC14RC13RB5 RB4
Salidas digitales

Mag. Ing. Sergio Salas

Facultad de Ingeniera Electrnica y Mecatrnica Carrera: Ingeniera Electrnica

Algoritmo de lectura del teclado usando los pines CN0-CN7 (Tercera parte)
0 0 0 0

RB2

RB1
RB0

5V 5V 0V 1 1 1 RC14RC13RB5 RB4
Entradas digitales con pull up activo

Mag. Ing. Sergio Salas

Salidas digitales

Se pulsa la tecla 4

RB3

Facultad de Ingeniera Electrnica y Mecatrnica Carrera: Ingeniera Electrnica

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 salidas digitales 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.

Mag. Ing. Sergio Salas

Facultad de Ingeniera Electrnica y Mecatrnica Carrera: Ingeniera Electrnica

Algoritmo de deteccin de las teclas pulsadas (parte 1)


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;

Mag. Ing. Sergio Sala

Facultad de Ingeniera Electrnica y Mecatrnica Carrera: Ingeniera Electrnica

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); Mag. Ing. Sergio Sala

Algoritmo de deteccin de las teclas pulsadas (parte 3)


Carrera: Ingeniera Electrnica

Facultad de Ingeniera Electrnica y Mecatrnica

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);

Mag. Ing. Sergio Salas

Algoritmo de deteccin de las teclas pulsadas (parte 4)


Carrera: Ingeniera Electrnica

Facultad de Ingeniera Electrnica y Mecatrnica

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) { //COL3 TRISB &= 0xFF0F; TRISB |= 0x000F; TRISC = 0x0FFF; LATB = 0; LATC = 0; CNPU1 = 0x00FF;

Mag. Ing. Sergio Sala

Algoritmo de deteccin de las teclas pulsadas (parte 5)


Facultad de Ingeniera Electrnica y Mecatrnica Carrera: Ingeniera Electrnica

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;

Mag. Ing. Sergio Salas

Algoritmo de deteccin de las teclas pulsadas (parte 6)


Facultad de Ingeniera Electrnica y Mecatrnica Carrera: Ingeniera Electrnica

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;

Mag. Ing. Sergio Salas

Algoritmo de deteccin de las teclas pulsadas (parte 7)


Facultad de Ingeniera Electrnica y Mecatrnica Carrera: Ingeniera Electrnica

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;retu else 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;retu else {TRISB &= 0xFFF0;TRISB |= 0x00F0;TRISC = 0xFFFF;LATB = 0;retu
} else return('N'); }

Mag. Ing. Sergio Salas

Facultad de Ingeniera Electrnica y Mecatrnica Carrera: Ingeniera Electrnica

Las Interrupciones

En el mundo de los microcontroladores, es muy comn implementar programas multita 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 flanco 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 o 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 procesamiento al tener que sostener tantos procesos a la vez.

Para evitar todos estos inconvenientes, los microcontroladores cuentan con un sistema que permite detectar eventos externos al procesador en los momentos que ocurren y s procesador con tareas en el instante que dicho evento ha sido generado.

Mag. Ing. Sergio Salas

Facultad de Ingeniera Electrnica y Mecatrnica Carrera: Ingeniera Electrnica

El concepto de una interrupcin

Telfono con la bocina malograda Hombre trabajando en la programacin de un microcontrolador dsPIC30F3014. (Tarea Principal)

Timbre malogrado

Mag. Ing. Sergio Salas

Facultad de Ingeniera Electrnica y Mecatrnica Carrera: Ingeniera Electrnica

La prioridad de una interrupcin

Qu sucede si el telfono y el timbre suenan al mismo tiem A quin se atiende primero?

Prioridad 5 (menor)

Telfono con la bocina malograda Hombre trabajando en la programacin de un microcontrolador dsPIC30F3014. (Tarea Principal)

Timbre malogrado

Prioridad 7 (mayor)

Mag. Ing. Sergio Salas

Facultad de Ingeniera Electrnica y Mecatrnica Carrera: Ingeniera Electrnica

Posibles causas de interrupcin en el dsPIC30F3014

Interrupcin externa 0 (INT0). Interrupcin por cambio de estado (CNx). Entrada de captura 1 (IC1). Interrupcin externa 1 (INT1). Comparacin de salida 1 (OC1). Interrupcin externa 2 (INT2). Timer 1. Receptor del UART 2. Entrada de captura 2 (IC2). Transmisor del UART 2. Comparacin de salida 2 (OC2). Bus CAN. Timer 2. Deteccin de bajo voltaje (LVD). Timer 3. Interrupciones reservadas. 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. Mag. Ing. Sergio Salas

Facultad de Ingeniera Electrnica y Mecatrnica Carrera: Ingeniera Electrnica

Tabla de interrupciones del dsPIC30F3014

El nmero de interrupcin (INT Number) especifica la prio natural de la interrupcin. Mientras menor sea este nmer alta ser la prioridad.

El nmero de vector es el identificador de la interrupcin e de vector de interrupciones (IVT).

Los vectores de interrupciones se encuentran en la memo a partir de la direccin 0x000014.

Cuando un evento de interrupcin ocurre, el Puntero de pr (PC) salta a la direccin respectiva del vector de interrupc La direccin de dicho vector se debe encontrar la instrucc RUT_INT_XX, donde XX es el nombre asociado a la inter especfica de dicho vector.

El salto a la rutina de interrupcin toma cuatro ciclos de re ocurre para salir de la interrupcin y regresar al punto don PC se haba quedado. Mag. Ing. Sergio Salas

Facultad de Ingeniera Electrnica y Mecatrnica Carrera: Ingeniera Electrnica

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. Un la interrupcin esta bandera debe ser puesta a 0 lgico por Firmware, ya que de no ha 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 la asignacin al registro IFS0:
IFS0bits.T1IF = 0;

Mag. Ing. Sergio Salas

Facultad de Ingeniera Electrnica y Mecatrnica Carrera: Ingeniera Electrnica

Los registros habilitadores de interrupciones

Los registros IECx permiten habilitar las respectivas interrupciones del CPU. Una vez pu el respectivo bit, la interrupcin queda activa y es posible que un evento la dispare. Esto normalmente se habilitan una sola vez en el programa, a menos que el programador des interrupcin a raz de otro evento.

Para habilitar la interrupcin por el Timer 1 se hace la siguiente asignacin al registro IEC IEC0bits.T1IE = 1;

Mag. Ing. Sergio Salas

Facultad de Ingeniera Electrnica y Mecatrnica

Los registros de configuracin de prioridad de interrupcin

Carrera: Ingeniera Electrnica

Si se van a utilizar unas cuantas interrupciones del dsPIC es posible reasignar las prior 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 reg contienen 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 ins IPC0 = IPC0 | 0x3000;

Mag. Ing. Sergio Salas

Facultad de Ingeniera Electrnica y Mecatrnica Carrera: Ingeniera Electrnica

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 automtic eventos que generan que la bandera de interrupcin sea 1 lgico. Esta funcin no recib parmetros.

El nombre de la rutina de interrupcin corresponde al vector asignado en la IVT. Este val 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)

Mag. Ing. Sergio Salas

Facultad de Ingeniera Electrnica y Mecatrnica Carrera: Ingeniera Electrnica

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 dispara (INT0)

RA11

dsPIC30F3014

INT 1

INT 2

Mag. Ing. Sergio Salas

Facultad de Ingeniera Electrnica y Mecatrnica Carrera: Ingeniera Electrnica

Programa de manejo de la INT0


int 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; }

Mag. Ing. Sergio Salas

You might also like