Clase Teclado e Interrupcion

12
 INTERRUPCIONES Y MANEJO DE UN TECLADO Una interrupción es un evento especial, ya que "interrumpe" al microcontrolador de su ejecución en curso, podríamos mencionar como ejemplo el hecho de que el microcontrolador este ocupado ejecutando una secuencia de código para sumar multiplicar y hacer algunos procesos más de unos datos, una interrupción se genera y el microcontrolador es obligado a detener la ejecución de ese proceso que estaba haciendo y desviar su atención por un momento para ejecutar un código (subrutina) que se debe hacer por la presencia de la interrupción, posteriormente cuando se termine de ejecutar la rutina que se hace por la interrupción, el procesador del microcontrolador vuelve a ejecutar el proceso que antes estaba haciendo desde el lugar desde donde fue interrumpido. Las interrupciones tienen muchas ventajas, ya que se puede de cierta manera obtener una especie de "paralelismo" porque el micro puede ejecutar el código principal, y en momentos especiales por las interrupciones, ejecutar una parte de código como si todo sucediera a la misma vez y volver al programa principal. Pero a la vez se debe tener cuidado en su manejo, pues son un arma de doble filo si no son bien administradas, en caso de tener que usar muchas interrupciones, o al tener mucho código que ejecutar en la rutina de interrupción. El microcontrolador tiene varias fuentes de interrupción, algunas son: por conversión análoga a digital terminada, por escritura en la eeprom completada, por desborde de temporizadores, por recepción de datos en la uart, por transmisión de datos completada en la uart, interrupciones externas por pines del micro al detectar un flanco ya sea de bajada o subida, entre otras. En los micros AVR cada interrupción posee su propio vector de interrupción lo que hace más cómoda su ejecución y programación de la rutina correspondiente (ver tabla 11-1 del datasheet, adjunto en la siguiente pág ina de este documento). Ahora se describen las configuraciones para utilizar la interrupción externa INT0, cabe mencionar que el micro ATMEGA16 posee dos fuentes de interrupción externa, estas son INT0 ya mencionada además de INT1, alojadas en los pines D2 y D3 del micro respectivamente. Usaremos la Interrupción INT0 en el pin D2, los registros involucrados para su configuración son: MCUCR – MCU Control Register  GICR – General Interrupt Control Register  GIFR – General Interrupt Flag Register

Transcript of Clase Teclado e Interrupcion

5/13/2018 Clase Teclado e Interrupcion - slidepdf.com

http://slidepdf.com/reader/full/clase-teclado-e-interrupcion-55a74d53b5a1d 1/12

INTERRUPCIONES Y MANEJO DE UN TECLADO

Una interrupción es un evento especial, ya que "interrumpe" al microcontrolador de su

ejecución en curso, podríamos mencionar como ejemplo el hecho de que elmicrocontrolador este ocupado ejecutando una secuencia de código para sumarmultiplicar y hacer algunos procesos más de unos datos, una interrupción se genera yel microcontrolador es obligado a detener la ejecución de ese proceso que estabahaciendo y desviar su atención por un momento para ejecutar un código (subrutina)que se debe hacer por la presencia de la interrupción, posteriormente cuando setermine de ejecutar la rutina que se hace por la interrupción, el procesador delmicrocontrolador vuelve a ejecutar el proceso que antes estaba haciendo desde ellugar desde donde fue interrumpido.

Las interrupciones tienen muchas ventajas, ya que se puede de cierta manera obteneruna especie de "paralelismo" porque el micro puede ejecutar el código principal, y en

momentos especiales por las interrupciones, ejecutar una parte de código como si todosucediera a la misma vez y volver al programa principal. Pero a la vez se debe tenercuidado en su manejo, pues son un arma de doble filo si no son bien administradas, encaso de tener que usar muchas interrupciones, o al tener mucho código que ejecutaren la rutina de interrupción.

El microcontrolador tiene varias fuentes de interrupción, algunas son: por conversiónanáloga a digital terminada, por escritura en la eeprom completada, por desborde detemporizadores, por recepción de datos en la uart, por transmisión de datoscompletada en la uart, interrupciones externas por pines del micro al detectar unflanco ya sea de bajada o subida, entre otras.

En los micros AVR cada interrupción posee su propio vector de interrupción lo que hace

más cómoda su ejecución y programación de la rutina correspondiente (ver tabla 11-1del datasheet, adjunto en la siguiente página de este documento).

Ahora se describen las configuraciones para utilizar la interrupción externa INT0, cabemencionar que el micro ATMEGA16 posee dos fuentes de interrupción externa, estasson INT0 ya mencionada además de INT1, alojadas en los pines D2 y D3 del microrespectivamente.

Usaremos la Interrupción INT0 en el pin D2, los registros involucrados para suconfiguración son:

•  MCUCR – MCU Control Register• 

GICR – General Interrupt Control Register•  GIFR – General Interrupt Flag Register

5/13/2018 Clase Teclado e Interrupcion - slidepdf.com

http://slidepdf.com/reader/full/clase-teclado-e-interrupcion-55a74d53b5a1d 2/12

 

Se muestra ahora el significado de los bits que intervienen en el manejo de lainterrupción INTO (externa por el pin D2).

MCUCR – MCU Control Register

Bit 3, 2 – ISC11, ISC10: Interrupt Sense Control 1 Bit 1 and Bit 0: Se usan parala INT1.

Bit 1, 0 – ISC01, ISC00: Interrupt Sense Control 0 Bit 1 and Bit 0: Se usan parala INT0, y responde a la siguiente tabla:

5/13/2018 Clase Teclado e Interrupcion - slidepdf.com

http://slidepdf.com/reader/full/clase-teclado-e-interrupcion-55a74d53b5a1d 3/12

 

Que nos dice como se generará la interrupción, puede ser con un estado bajo en el pin(00), por cualquier cambio de estado (01), por flanco de bajada (10), o por flanco desubida (11).

GICR – General Interrupt Control Register

Bit 6 – INT0: External Interrupt Request 0 Enable: Mediante este bit puesto en 1se activa la máscara de Interrupción Externa 0, esto quiere decir que activando el bitde interrupciones globales se podrá esperar por la interrupción configurada.

GIFR – General Interrupt Flag Register

Bit 6 – INTF0: External Interrupt Flag 0: Es la bandera de interrupción que sepone automáticamente en 1 cuando se ha producido la Interrupción Externa 0 yademás las interrupciones globales están habilitadas, entonces el procesador saltará alvector de interrupción correspondiente. Se pondrá a 0 por hardware cuando la rutinade interrupción se ejecute.

Ahora como ejemplo se muestra una forma de controlar la interrupción externa delmicro por el pin D2 (INT0). Mediante 2 displays de 7 segmentos se visualiza un conteoascendente de 0 a 99, conteo que será incrementado por la INT0.

El manejo de los displays se hace por tabla de datos, o datos constantes en lamemoria de programa, a la vez que accedo a la memoria RAM para almacenar losdatos del conteo.

5/13/2018 Clase Teclado e Interrupcion - slidepdf.com

http://slidepdf.com/reader/full/clase-teclado-e-interrupcion-55a74d53b5a1d 4/12

Código;--------------------------------------------------------------------------------

; Programa: Contador 0-99 por interrupción

; Version: 0.0

;

; Dispositivo: ATmega16 Compilador: AVRASM2

; Entorno IDE: AVR Studio4.15 Simulador: Proteus 7.5sp3

;

; Notas: Este programa realiza un conteo ascendente de 0 a 99 mediante

; 2 Displays de 7 segmentos, y un pulsador que incrementa la cuenta

;

; Registros: r5 a r14 para la tabla que maneja los displays de 7 segmentos

; r16 para configuraciones, y despues con r15 manipula los datos de

; unidades y decenas de la tabla para el display.

; r30 y r21 para llevar la cuenta de las unidades y decenas.

; r22 es el registro bandera para saber si ocurre la interrupcion externa

; r30 y r31 (Z) para direccionamiento indirecto de las constantes

; en memoria de programa que se almacenan de los datos del display; de 7 segmentos.

; r28 y r29 (Y), para copia de la dirección original de las constantes.

; r17 y r18 son para el retardo de 1ms.

;

; Conexiones: C0 -> Anodo Display 1

; C1 -> Anodo Display 2

; B0 -> Segmento a del Display

; B1 -> Segmento b del Display

; B3 -> Segmento c del Display

; B4 -> Segmento d del Display

; B5 -> Segmento e del Display

; B6 -> Segmento f del Display

; B7 -> Segmento g del Display

; D2 -> Pulsador;--------------------------------------------------------------------------------

;DIRECTIVAS EN ENSAMBLADOR

.include "m16def.inc" ;ATmega16

.device ATMEGA16

;Constantes utilizadas

.def flag=r22

;reset-vector address $0000

.org $0000

  jmp inicio ;va al inicio

;vector de interrupcion con la direccion de INT0

.org $02  jmp int_ext ;va a la interrupción externa

;Subrutina con instrucciones a realizar con INT0

int_ext:

ser flag ;ponemos flag (r22) a 255

reti ;retorno de rutina de interrupción, habilitando I del SREG

;PROGRAMA PRINCIPAL

inicio:

;Cargar el puntero de pila

ldi r16,high(ramend) ;Configuracion de...

out sph,r16

ldi r16,low(ramend)

5/13/2018 Clase Teclado e Interrupcion - slidepdf.com

http://slidepdf.com/reader/full/clase-teclado-e-interrupcion-55a74d53b5a1d 5/12

out spl,r16 ;...la pila: Stack: $045F=RAMEND

;Confirugracion de los registros a usar

ser r16 ;r16 <- $FF

out ddrc,r16 ;portC todo de salida

out ddrb,r16 ;portB todo de salida

ldi r16,$fb ;r16 <- $fb

out ddrd,r16 ;portD salidas, excepto D2

;configuración de la Interrupción.

ldi r16,3 ;r16 <- 3

out mcucr,r16 ;configuramos nivel bajo para INT1, y flanco de subida para

INT0

ldi r16,$40 ;r16 <- $40

out gicr,r16 ;activamos la INT0 solamente

clr r16 ;r16 <- 0

out gifr,r16 ;limpiarmos flags de interrupcion INTF0 e INTF1 e INTF2

;Cargar los valores de datos para mostrar los datos en el display de ánodo común;Puerto: B7 B6 B5 B4 B3 B2 B1

B0

;Segmentos: g f e d c X b a

ldi r16, $80 ; 1 0 0 0 0 0 0 0

mov r5,r16 ;Cero en R5

ldi r16, $F1 ; 1 1 1 1 0 0 0 1

mov r6,r16 ;Uno en R6

ldi r16, $48 ; 0 1 0 0 1 0 0 0

mov r7,r16 ;Dos en R7

ldi r16, $60 ; 0 1 1 0 0 0 0 0

mov r8,r16 ;Tres en R8

ldi r16, $31 ; 0 0 1 1 0 0 0 1

mov r9,r16 ;Cuatro en R9

ldi r16, $22 ; 0 0 1 0 0 0 1 0mov r10,r16 ;Cinco en R10

ldi r16, $02 ; 0 0 0 0 0 0 1 0

mov r11,r16 ;Seis en R11

ldi r16, $B0 ; 1 0 1 1 0 0 0 0

mov r12,r16 ;Siete en R12

ldi r16, $00 ; 0 0 0 0 0 0 0 0

mov r13,r16 ;Ocho en R13

ldi r16, $20 ; 0 0 1 0 0 0 0 0

mov r14,r16 ;Nueve en R14

;inicializacion de registros importantes

clr flag ;bandera para identificar interrupción puesta a 0

ldi r20,$00 ;registro para unidades

ldi r21,$00 ;registro para decenasldi r30,$05 ;apuntador Z a R5 que contiene el cero

sei ;se habilitan las interrupciones globales

;ciclo de mostrar en el display

ciclo:

cpi flag,255 ;preguntamos si flag es 255

breq incremento ;si es 255, la interrupción ocurrió, saltamos a incrementar

multi:

call multiplexar ;vamos a visualizar los datos en los displays multiplexados

  jmp ciclo ;ciclo infinito

;rutina de incremento hasta 99

incremento:

5/13/2018 Clase Teclado e Interrupcion - slidepdf.com

http://slidepdf.com/reader/full/clase-teclado-e-interrupcion-55a74d53b5a1d 6/12

call multiplexar ;mostramos datos, hasta que se suelte el pulsador

sbic pind,2 ;pin D2 esta todavía siendo pulsado?

  jmp incremento ;si, está pulsado, volvemos a mostrar el valor actual del conteo, sino se

salta instrucción

inc r20 ;incrementamos el valor de r20 que contiene el valor de unidades

cpi r20,10 ;r20<10?

brmi salir ;si es menor, salimos, sino...

clr r20 ;r20 <- 0, unidades a cero

inc r21 ;incrementamos r21 que contiene el valor de decenas

cpi r21,10 ;r21<10?

brmi salir ;si es menor, salimos, sino...

clr r21 ;r21 <- 0,decenas a cero

salir:

clr flag ;ponemos flag a 0

  jmp multi ;volvemos a multiplexar, con los nuevos datos

multiplexar:

cbi portc,0 ;apagamos amboscbi portc,1 ;displays

mov r28,r30 ;copiamos la dirección donde estan

mov r29,r31 ;los datos del display

add r30,r20 ;se suma el valor de unidades, para desplazarse en la tabla

ld r16,Z ;r16 <- (Z)

mov r30,r28 ;r30 <- r28

add r30,r21 ;se suma el valor de decenas, para desplazarse en la tabla

ld r15,Z ;r17 <- (Z)

mov r30,r28 ;r30 <- r28

out portb,r16 ;se muestra en el display de unidades, el valor correspondiente

sbi portc,0 ;enciende el display correspondiente

;call unseg

call delay1m ;tiempo de retardo para que sea visible al ojo

cbi portc,0 ;se apaga el display encendido anteriormenteout portb,r15 ;se muestra en el display de decenas, el valor correspondiente

sbi portc,1 ;enciende el display correspondiente

;call unseg

call delay1m ;tiempo de retardo para que sea visible al ojo

cbi portc,1 ;se apaga el display encendido anteriormente

ret

; =============================

; delay loop generator

; 4000 cycles:

; -----------------------------

; delaying 3999 cycles:

delay1m:

ldi R17, $1FWGLOOP00: ldi R18, $2A

WGLOOP11: dec R18

brne WGLOOP11

dec R17

brne WGLOOP00

; -----------------------------

; delaying 1 cycle:

nop

ret

; =============================

; =============================

;Subrutina de 1seg

5/13/2018 Clase Teclado e Interrupcion - slidepdf.com

http://slidepdf.com/reader/full/clase-teclado-e-interrupcion-55a74d53b5a1d 7/12

; 4000000 cycles:

; -----------------------------

; delaying 3999996 cycles:

unseg: ldi R17, $24

WGLOOP03: ldi R18, $BC

WGLOOP04: ldi R19, $C4

WGLOOP05: dec R19

brne WGLOOP05

dec R18

brne WGLOOP04

dec R17

brne WGLOOP03

; -----------------------------

; delaying 3 cycles:

ldi R17, $01

WGLOOP06: dec R17

brne WGLOOP06

; -----------------------------; delaying 1 cycle:

ret

; =============================

Esquema de conexiones:

5/13/2018 Clase Teclado e Interrupcion - slidepdf.com

http://slidepdf.com/reader/full/clase-teclado-e-interrupcion-55a74d53b5a1d 8/12

Programa para uso de teclado de matriz de 4x4 

Ahora, un programa que lee una tecla presionada en un teclado 4x4. Una buena

manera de ahorrar líneas de entrada al micro es, en lugar de dedicar una líneaexclusiva por cada tecla utilizada, emplear un teclado matricial. El teclado matricial secaracteriza por estar cada una de las teclas conectada a dos líneas (una columna y unafila) que la identifican. De este modo el número de teclas que pueden conectarse es elproducto de filas por el de columnas.

La técnica de programación requiere tanto de entradas como de salidas. Las filas estánconectadas a las patillas de salida y las columnas a las de entrada.

Se comienza el testeo colocando a ‘0’ la primera columna, y a ‘1’ las restantes. Si latecla pulsada estuviese en la fila ‘1’, ésta colocaría en su línea un ‘0’ lógico. Bastarácon hacer un muestreo de las filas, buscando el 0, para saber la tecla exacta que fuepulsada en la matriz de teclas.

Si no es pulsada ninguna tecla en una fila, las entradas se encuentran en estadoflotante, razón por la que son necesarias las resistencias de polarización internas, que

mantienen las entradas a nivel alto.

También pueden usarse resistencias externas, e incluso llevarlas a tierra. En tal caso,lo que se busca es un UNO en las líneas de entrada.

Las instrucciones que son útiles para saber cuando se presiona la tecla son:

sbic pinb,5

Brinca la siguiente instrucción si el bit 5 del puerto B está en CERO.

Si fuera sbis, brinca la siguiente instrucción si el bit 5 del puerto B está en UNO.

5/13/2018 Clase Teclado e Interrupcion - slidepdf.com

http://slidepdf.com/reader/full/clase-teclado-e-interrupcion-55a74d53b5a1d 9/12

El programa es:

;----------------------------------------

;; Autor: MigSantiago

; Adaptación ATMEGA16 por Lewin Lopez

;

; Notas: Este programa realiza un barrido por filas

; en el puerto B donde se encuentra conectado un teclado

; matricial 4x4. En el puerto D se muestra el valor de la

; tecla de acuerdo a la tabla siguiente:

;

; pb4 pb5 pb6 pb7

; | | | |

; pb0 -> 0 1 2 3

; pb1 -> 4 5 6 7

; pb2 -> 8 9 a b

; pb3 -> c d e f ;

; Registros: r16 -> registro temporal para pasar datos.

; r17 -> registro de mostrar tecla presionada

; r18 -> registro para contar el barrido

; r19 -> registro para contar la fila actual

;

; Conexiones: Puerto B -> Teclado

; pb0, pb1, pb2, pb3 Salidas matriz

; pb4, pb5, pb6, pb7 Entradas matriz

; Puerto D -> Salida Hexadecimal de tecla presionada

; pd4 -> salida estado tecla presionada (E)

;----------------------------------------

.include "m16def.inc"

.device ATMEGA16

.org 0000

 jmp inicio

inicio:

;Cargar el puntero de pila

LDI R16, HIGH(RAMEND)

OUT SPH, R16

LDI R16, LOW(RAMEND)

OUT SPL, R16

;Configuracion de puertos

SER R16 ;FFOUT DDRD,R16 ;PtoD Salida

LDI R16,$0F ;00001111

OUT DDRB,R16 ;PtoB 4sal 4ent

;Inicializacion de puertos y activacion de pull-up

CLR R16

OUT PORTD,R16 ;borra PtoD

OUT PORTB,r16 ;borra PtoB y desactiva pull-up internas

reinicio:

;Programa Principal

clr r16

clr r17 ;Registro mandado a ptoD

5/13/2018 Clase Teclado e Interrupcion - slidepdf.com

http://slidepdf.com/reader/full/clase-teclado-e-interrupcion-55a74d53b5a1d 10/12

clr r18 ;registro del contador de barrido

clr r19 ;indicador de línea actual de barrido

linea1:

ldi r16,$01

out portb,r16 ;rb0=1 línea 1 activa

rjmp barrido ;va a checar presión de tecla

linea2:

inc r19

inc r18 ;en subrutina barrido, la primer línea

;no hace incremento, por eso se

;incrementa aquí 

ldi r16,$02

out portb,r16 ;rb1=1 línea 2 activa

rjmp barrido

linea3:

inc r19 ;incrementa indicador de líneainc r18

ldi r16,$04

out portb,r16 ;rb2=1 línea 3 activa

rjmp barrido

linea4:

inc r19 ;incrementa indicador de línea

inc r18

ldi r16,$08

out portb,r16 ;rb3=1 línea 4 activa

rjmp barrido

nopresion:

clr r16 ;pon E y LEDS a ceroout portd,r16 ;no hubo presión

rjmp reinicio

barrido:

sbic pinb,4 ;si rb4=0 no hay presión

rjmp presion

inc r18 ;siguiente tecla

sbic pinb,5

rjmp presion

inc r18 ;siguiente tecla

sbic pinb,6

rjmp presion

inc r18 ;siguiente tecla

sbic pinb,7rjmp presion

rjmp quelinea ;no hubo presión en X línea

presion:

mov r17,r18 ;r17=r18

out portd,r17 ;saca tecla y E por portd

sbi portd,4 ;pd4=1 es decir E=1

rjmp reinicio ;que ya no haga barrido

quelinea:

cpi r19,$00 ;determina en que línea de barrido va

breq linea2 ;va a línea 2

cpi r19,$01

5/13/2018 Clase Teclado e Interrupcion - slidepdf.com

http://slidepdf.com/reader/full/clase-teclado-e-interrupcion-55a74d53b5a1d 11/12

breq linea3

cpi r19,$02

breq linea4

cpi r19,$03

breq nopresion ;se va a limpiar ptod

;-----------------------------

Al final lo que hace el programa es determinar si se presionó una tecla. Si se presionó,enciende la salida E (pd4) y saca la tecla por pd0, pd1, pd2, pd3. Si se presionara elCERO sólo encendería E y pd0, pd1, pd2, pd3 estarían apagadas. Si se presionara latecla F encendería E y todas las demás: 1111 = 15 = F.

El esquema de conexiones es:

Declaración de variables 

No uso la declaración de variables para los registros del AVR, pero les explico unas

directivas para usarlas:

Si quieres definir pines:

.equ RxD =0; En este caso el pin 0 se llama RxD

.equ TxD =1; En este caso el pin 1 se llama TxD

Si quieres renombrar registros:

.def contbit =R16

5/13/2018 Clase Teclado e Interrupcion - slidepdf.com

http://slidepdf.com/reader/full/clase-teclado-e-interrupcion-55a74d53b5a1d 12/12

.def temporal =R17

Y se usan normalmente:

cbi PORTD,TxD; el pin 1 se pone a cero

ldi contbit,$aa; Carga el R16 con AA

EJERCICIO EN CLASE 9.

a)  Realizar un programa que permita identificar la tecla presionada en el teclado,pero muestre su salida por el puerto C, conecte el teclado al puerto D y utiliceresistencias internas de pull-up.

b)  Realizar un programa que utilice la interrupción externa INT1 para detectar unpulsador que cuando se presiona incrementa la letra que se visualiza en unLCD. El programa debe funcionar hasta mostrar la letra ‘z’.