ESCUELA POLITÉCNICA NACIONAL DEPARTAMENTO DE CONTROL Y AUTOMATIZACIÓN
LABORATORIO DE SISTEMAS MICROPROCESADOS PREPARATORIO
TEMA: Utilización de subrutinas, barrido de teclado. PRÁCTICA: 8
REALIZADO POR: Nathaly Johanna Díaz Enríquez GRUPO: GR2/04 HORARIO : Lunes, 11-13h FECHA DE ENTREGA:
2014-04-21
PRÁCTICA Nº8 1.
TEMA: “Utilización
de Subrutinas, Barrido de Teclado”
2. OBJETIVO: Diseñar un circuito, y el software asociado para manejar un teclado matricial de 16 teclas en conjunto con 4 display de 7 segmentos. En los dos casos se usará la técnica de barrido. Desarrollar programas en forma modular usando subrutinas. 3. PREPARATORIO:
Se debe modificar el hardware de la práctica anterior, de manera que los datos a ser ingresados al microcontrolador no provengan de interruptores, sino de un teclado matricial. Mantener todo el hardware asociado al barrido de display. Se deben realizar las siguientes modificaciones: Desarrollar una subrutina que permita identificar o decodificar las teclas que se presionan en un teclado de 16 teclas. Las teclas a identificar deben ser: 0, 1, 2, 3, 4, 5, 6, 8, 9, *, =, BORRAR; las otras teclas quedarán sin función. El funcionamiento de esta rutina será de la siguiente manera: conforme se vayan aplastando las teclas de números, éstos deben ir apareciendo el el dígito menos significativo, y conforme se vayan presionando otros números se van desplazando a la izquierda como en una calculadora. Solo se pueden ingresar hasta dos dígitos, es decir el mayor número que se puede ingresar será el 99. Luego de ingresado el primer operando se debe presionar la tecla de multiplicación (*) y luego el segundo operando de hasta dos dígitos (de manera similar al primer operando), luego se presiona el igual (=), y en los 4 display se debe mostrar el resultado de la operación. Si en cualquier momento se presiona la tecla BORRAR durante el ingreso de los números, el display vuelve a 0000 y se reinicia el ingreso del operando. Si se presiona BORRAR cuando se está mostrando el resultado de la operación anterior, se muestra 0000 y se vuelve a iniciar con el ingreso del primer operando. Al final se muestra un circuito sugerido para el barrido de teclado. Las resistencias se deben poner a fin de evitar cortocircuitos que pueden ocurrir a las salidas del micro controlador cuando se presionan dos teclas simultáneamente. Los diodos son optativos, y se colocan si se desea manejar el teclado por medio de una interrupción. Mientras dura el ingreso de cada uno de los números en BCD desde el teclado, éstos deben ser almacenados en cuatro localidades consecutivas llamadas DIG3, DIG2, DIG1, y DIG0. desde donde los tomará la subrutina de barrido de display para mostrarlos. Luego esta rutina de barrido de display también se usará para mostrar el resultado. Para la rutina de barrido de teclado se debe tomar precaución con el rebote de las teclas; y también considerar el caso de que se mantenga presionado durante mucho tiempo una tecla debe ser reconocida como una sola pulsación, hasta que se libere la tecla. El algoritmo para convertir de BCD a su equivalente en 7 segmentos debe ser modificado para que pueda ser llamado como una subrutina. Se deben tomar las precauciones para que esta rutina no modifique registros que puedan estar siendo utilizados en el programa principal, por lo que se pueden salvar en el STACK los registros que se piense usar en la subrutina, y antes de retornar al programa principal se los puede recuperar del STACK y volverlos a sus valores originales. El algoritmo de barrido de display debe ser modificado para que pueda ser llamado como una subrutina, debe tomar los datos a mostrar desde la memoria SRAM desde cuatro localidades consecutivas. También tomar las precauciones necesarias para que no se modifiquen registros del programa principal. o
o
o
o
o
o
/* * barrido_teclado.asm * * Created: 20/04/2014 5:36:24 * Author: Nathy */ .include "m164pdef.inc" ;definicion de variables .def teclado=r16 .def bandera=r17 .def display=r18 .def tempo=r19 .def contador=r20 .def conver=r21 .def tempo1=r22
.def aux=r23 .def AUX1=r24 .def AUX2=r25 .dseg BINARIO: .BYTE 2 BCD0: .BYTE 4 DIG0: .BYTE 4 DATOS: .BYTE 4 .cseg .org 0x0 ;configuracion de puertos ldi r16,255;cargo unos al registro r16 out ddra,r16;con esto defino puerto b como salida ldi r16,0b00001111; cargo al puerto b como entrada y salida esto porque ahí irá el teclado out ddrb,r16;se envía datos para testear mi teclado y a la vez recibir los datos de las pulsaciones ;bits de control LDI tempo,0b00001111 OUT DDRC,tempo ;inicializo mi stack pointer ldi r16,high(ramend) out sph,r16 ldi r16,low(ramend) out spl,r16 ;para activar el pull up ldi r16,255 out porta,r16 ;pongo todas las salidas de la a1-a4 en 0L ldi r18,0b00000000 out portb,r18 ; RUTINA DEL BARRIDO DE TECLADO main: rcall testear cpi bandera,1 brne main MULTIPLICACION: call BCD_7SEG call BARRIDO lds teclado,BCD0 ldi AUX,10 mul teclado,AUX mov AUX1,R0 lds teclado,BCD0+1 add AUX1,teclado ;AUX1 PRIMER NUMERO A MULTIPLICAR lds teclado,BCD0+2 mul teclado,AUX mov AUX2,R0 lds teclado,BCD0+3 add AUX2,teclado ;AUX2 SEGUNDO NUMERO A MULTIPLICAR ;LA MULTIPLICACION SERIA: mul AUX1,AUX2 sts BINARIO, R0 sts BINARIO+1,R1 call BIN_BCD call BCD_7SEG call BARRIDO ldi bandera,0 ldi r18,0b00000000 out portb,r18 mantener: in r18,pinb
andi r18,0b11110000 cpi r18,0b11110000 brne mantener rcall RET_BARRIDO rjmp main ;en esta subrutina se busaca si alguna tecla fue presionada ;esta realizando un senso de las filas si una esta activada ;entonces va a buscar cual es la tecla presionada testear: sbis pinb,7 rcall buscar sbis pinb,6 rcall buscar sbis pinb,5 rcall buscar sbis pinb,4 rcall buscar ret ;SUBRUTINA DE BARRIDO DE TECLADO ;ahora reviso la columnas con la subrutina buscar para establecer que teclas se precionó ;y le asigno un valor a cada letra q se presione en el teclado buscar: rcall RET_BARRIDO ;este retardo lo desarrollopara posibles rebotes ;pongo en cero a la cuarta columna que es a la que voy a revisar si tiene o no una tecla presionada ldi r18,0b00000111 out portb,r18 ;reviso de tecla en tecla cual esta presionada sbis pinb,7;testeamos la cuarta fila de la cuarta columna ldi teclado,13; se asigna a la tecla un nombre y en hexadecimal es la "D" sbis pinb,6 ldi teclado,12 sbis pinb,5 ldi teclado,11 sbis pinb,4 ldi teclado,10 ;pongo en cero la tercera columna y busco si se presiono alguna tecla ldi r18,0b00001011 out portb,r18 sbis pinb,7 ldi teclado,14 sbis pinb,6 ldi teclado,3 sbis pinb,5 ldi teclado,6 sbis pinb,4 ldi teclado,9 ;pongo en cero la segunda columna y busco sis e presiono alguna tecla ldi r18,0b00001101 out portb,r18 sbis pinb,7 ldi teclado,0 sbis pinb,6 ldi teclado,2 sbis pinb,5 ldi teclado,5 sbis pinb,4 ldi teclado,8 ;pongo en cero la primera columna y busco si presiono alguna tecla ldi r18,0b00001110 out portb,r18
sbis pinb,7 ldi teclado,15 sbis pinb,6 ldi teclado,1 sbis pinb,5 ldi teclado,4 sbis pinb,4 ldi teclado,7 ldi bandera,1 ret ; Subrutina de Binario a BCD para 16 bits BIN_BCD: PUSH r16 PUSH r17 PUSH r18 PUSH r19 LDS r16,BINARIO LDS r18,BINARIO+1 CLR r17 BIN_BCD_0: SUBI r16,232 SBCI r18,3 BRCS BIN_BCD_CEN INC r17 RJMP BIN_BCD_0 BIN_BCD_CEN:LDI r19,232 ADD r16,r19 LDI r19,3 ADC r18,r19 STS BCD0+3,r17 CLR r17 BIN_BCD_1: SUBI r16,100 SBCI r18,0 BRCS BIN_BCD_DEC INC r17 RJMP BIN_BCD_1 BIN_BCD_DEC:SUBI r16,-100 STS BCD0+2,r17 CLR r17 BIN_BCD_2: SUBI r16,10 BRCS BIN_BCD_UNI INC r17 RJMP BIN_BCD_2 BIN_BCD_UNI:SUBI r16,-10 STS BCD0+1,r17 STS BCD0,r16 POP r19 POP r18 POP r17 POP r16 RET ;rutina para convertir 4 digitos decimales a 7 segmentos(display) y almacenarlos en la sram BCD_7SEG: PUSH ZH PUSH ZL PUSH YH PUSH YL PUSH XH PUSH XL PUSH r16 PUSH r17
LDI XH,HIGH(BCD0) LDI XL,LOW(BCD0) LDI YH,HIGH(DIG0) LDI YL,LOW(DIG0) LDI r17,4 BCD_7SEG_0: LDI ZH,HIGH(Tabla_BCD_7SEG<<1) LDI ZL,LOW(Tabla_BCD_7SEG<<1) LD r16,X+ ADD ZL,r16 CLR r16 ADC ZH,r16 LPM r16,Z ST Y+,r16 DEC r17 BRNE BCD_7SEG_0 POP r17 POP r16 POP XL POP XH POP YL POP YH POP ZL POP ZH RET ;Subrutina de Barrido BARRIDO: PUSH r16 PUSH r17 PUSH YH PUSH YL PUSH r18 LDI r17,4 LDI r18,0b11111110 LDI YH,HIGH(DIG0) LDI YL,LOW(DIG0) BARRIDO_0: LDI r16,0b11111111 OUT PORTC,r16 LD r16,Y+ OUT PORTA,r16 OUT PORTC,r18 CALL RET_BARRIDO SEC ROL r18 DEC r17 BRNE BARRIDO_0 LDI r16,0b11111111 OUT PORTC,r16 RET BARRIDO1: PUSH r16 PUSH r17 PUSH YH PUSH YL PUSH r18 LDI r17,4 LDI r18,0b11111110 LDI YH,HIGH(DATOS) LDI YL,LOW(DATOS) BARRIDO_1: LDI r16,0b11111111 OUT PORTC,r16
LD r16,Y+ OUT PORTA,r16 OUT PORTC,r18 CALL RET_BARRIDO SEC ROL r18 DEC r17 BRNE BARRIDO_1 LDI r16,0b11111111 OUT PORTC,r16 RET ;Retardo de Barrido RET_BARRIDO: LDI r16,100 RET_BARRIDO_0: NOP DEC r16 BRNE RET_BARRIDO_0 RET Tabla_BCD_7SEG: .db 0b01000000,0b01111001 ;0,1 .db 0b00100100,0b00110000 ;2,3 .db 0b00011001,0b00010010 ;4,5 .db 0b00000010,0b01111000 ;6,7 .db 0b00000000,0b00010000 ;8,9 .db 0b00001000,0b00000011 ; (10)A,B(11) .db 0b01000110,0b00100001 ; (12)C,D(13) .db 0b00000110,0b00001110 ; (14)E,F(15) A
7
8
9
B
4
5
6
C
1
2
3
D
ON C 1
0
=
2
3
Reset
R? R? R? 100R R6 100R R7 100R R3 100R R4 100R R5 100R
+ 4
40 41 42 43 44 1 2 3
100R 100R
9 10 11 12 13 14 15 16
PB0/T0/XCK0/PCINT8 PB1/T1/CLKO/PCINT9 PB2/AIN0/INT2/PCINT10 PB3/AIN1/OC0A/PCINT11 PB4/SS/OC0B/PCINT12 PB5/MOSI/PCINT13 PB6/MISO/PCINT14 PB7/SCK/PCINT15
PA0/ADC0/PCINT0 PA1/ADC1/PCINT1 PA2/ADC2/PCINT2 PA3/ADC3/PCINT3 PA4/ADC4/PCINT4 PA5/ADC5/PCINT5 PA6/ADC6/PCINT6 PA7/ADC7/PCINT7
PD0/RXD0/PCINT24 PD1/TXD0/PCINT25 PD2/INT0/RXD1/PCINT26 PD3/INT1/TXD1/PCINT27 PD4/OC1B/XCK1/PCINT28 PD5/OC1A/PCINT29 PD6/ICP/OC2B/PCINT30 PD7/OC2A/PCINT31
PC0/SCL/PCINT16 PC1/SDA/PCINT17 PC2/TCK/PCINT18 PC3/TMS/PCINT19 PC4/TDO/PCINT20 PC5/TDI/PCINT21 PC6/TOSC1/PCINT22 PC7/TOSC2/PCINT23
29 AREF 27 AVCC 4 RESET
XTAL1 XTAL2
37 36 35 34 33 32 31 30 19 20 21 22 23 24 25 26
A1 A2 A3 A4 A5 A6 A7
R1 1.5k
R2
C1 C2 C3 C4
200 Reset
7 8
ATMEGA164P
U2(COM)
U2 A1 A2 A3 A4 A5 A6 A7
1 2 3 4 5 6 7
1B 2B 3B 4B 5B 6B 7B
t e s e R
COM 1C 2C 3C 4C 5C 6C 7C
9 16 15 14 13 12 11 10
A B C D E F G
A B C D E F G
A B C D E F G
A B C D E F G
A B C D E F G
R42(1)
ULN2003A
R8R30 R29 R28 R27 R26 R24
R41
R42
R43
R44
1k
1k
1k
1k
100R 100R 100R 100R 100R 100R 100R R24(1)
R31
Q1
1k
2N3904 C3
C4
R32
Q2 2N3904
1k
R33
Q3
R34
2N3904
C2 1k
Q4 2N3904
1k C1
Construya el circuito diseñado, el mismo que deberá ser llevado al laboratorio el día de la práctica.
Realice un modelo de simulación en proteus del circuito pedido y pruebe el funcionamiento de todos los programas solicitados.
4. BIBLIOGRAFÍA:
ATMEL, 8-bit AVR Instruction Set, ATmega164p. Ana Rodríguez, Sistemas Microprocesados, Apuntes de clase, 2014, EPN. Jaime Velarde, Sistemas Digitales, Apuntes de clase, 2013, EPN.