55 Direccionamiento Indirecto y Teclado Matricial PRÁCTICA 5 DIRECCIONAMIENTO INDIRECTO Y TECLADO MATRICIAL OBJETIVO: Identificar la forma de operar del modo de direccionamiento indirecto. Analizar el funcionamiento del un teclado matricial y sus algoritmos de decodificación. Aplicar el direccionamiento indirecto al programa de decodificación de un teclado matricial INTRODUCCION En la programación de los microcontroladores PIC de la gama media la mayoría de las instrucciones emplean direccionamiento directo, pero también es posible que operen en un modo de direccionamiento indirecto. Para el direccionamiento indirecto se emplean dos registros especiales: el FSR y el INDF (éste último no es un registro físico). El registro FSR se emplea para “señalar o apuntar” a una dirección cuyo contenido después puede ser leído ó escrito de forma indirecta empleando cualquier instrucción que use como operando al registro INDF. Internamente, a diferencia del direccionamiento directo, la dirección eficaz de 9 bits en un direccionamiento indirecto se obtiene concatenando los 8 bits del registro FSR con el bit IRP de registro STATUS (figura 5.1). Figura 5.1: Direccionamiento directo vs. direccionamiento indirecto. Eduardo Romero A. Laboratorio de Sistemas Digitales III 56 Direccionamiento Indirecto y Teclado Matricial De tal forma, que esta forma de direccionamiento es particularmente útil cuando se manejan tablas o arreglos de datos. MATERIAL Y EQUIPO EMPLEADO Laboratorio equipado con computadoras que tengan instalado el MPLAB versión v7.40 o superior y el WinPic800 v3.55 g. Cantidad 1 1 1 8ó1 4 8 1 1 Descripción Programador compatible con WinPic800. Microcontrolador PIC16F628 Teclado Matricial 4x4 Leds o barra de leds Resistencia de 330 Ω Resistencia de 4.7 kΩ Tableta experimental Fuente de alimentación de CD Pre-reporte: Leer previamente toda la práctica Descargar MPLAB v7.40 o superior y el WinPic800 v3.55 g de la página del curso y llevarlos el día de la sesión. Llevar implementado en un protoboard el circuito de la figura 5.5 DESARROLLO I. Direccionamiento indirecto 1.- Edite el siguiente programa con MPLAB y cree el proyecto de la forma acostumbrada. Ensamble y depure hasta que no existan errores o “warnings”. ; Programa que realiza la suma de 10 números almacenados ; a partir de la dirección 23h de la memoria de datos LIST RADIX include P=16F628A HEX "p16F628a.inc" cblock 20h SUMAH SUMAL LONG endc TABLA org res Eduardo Romero A. 23h .20 Laboratorio de Sistemas Digitales III 57 Direccionamiento Indirecto y Teclado Matricial org goto 0 INICIO org 5 clrf clrf movlw movwf movlw movwf SUMAH SUMAL .10 LONG TABLA FSR ; ; ; ; ; movf addwf movwf btfsc incf incf decfsz goto goto SUMAL,w INDF,w SUMAL STATUS,C SUMAH,f FSR,f LONG OTRO_NUM $ ; w <-- SUMAL ; w <-- SUMAL+(INDF) INICIO Suma total parte alta = 00h Suma total parte baja = 00h Cantidad de números a sumar = 10 Coloca apuntador ; al inicio de la tabla OTRO_NUM: ; ; ; ; ; ; Hubo acarreo? SI, SUMAH ++ Apunta al sig. elemento de la tabla Es el último elemento? No, continua sumando Si, termina END 2. Elabore el diagrama de flujo correspondiente al programa. 3. Proceda a inicializar la tabla con los valores a sumar, con el menú view>> 4 file registers, lo cual desplegará una ventana donde se puede modificar el contenido de los GPR’s. En nuestro caso vamos a introducir FFh en el contenido de las direcciones de memoria de la 23h a la 2Ch, tal como lo muestra la figura 5.2 Figura 5.2: Ventana que muestra el contenido de las direcciones 23h a 2Ch. Eduardo Romero A. Laboratorio de Sistemas Digitales III 58 Direccionamiento Indirecto y Teclado Matricial 3. Inserte un punto de ruptura (BREAK-POINT) en la instrucción decfsz LONG (Para insertar un punto de ruptura, dar doble “click” con el ratón posicionado en la instrucción, para borrarlo dar doble “click” nuevamente). 4. Active el simulador MPLAB SIM en Debugger>>Select tool>>MPLAB SIM y simule un RESET al microcontrolador, con el botón , a continuación ejecute la simulación del . Escriba el valor que tienen las siguientes variables programa con el botón RUN cuando la simulación se detiene al llegar al punto de ruptura. SUMAH ________ LONG __________ SUMAL _________ FSR ____________ 5. Reanude la simulación y vuelva anotar el contenido de los registros. Repita este paso hasta que el programa finalice. Englobe sus resultados en la tabla 6.1. Tabla 5.1: Valor de las variables del programa durante su ejecución. SUMAH SUMAL FSR LONG Pasada 1 Pasada 2 Pasada 3 Pasada 4 Pasada 5 Pasada 6 Pasada 7 Pasada 8 Pasada 9 Pasada 10 6. Modifique el contenido de la tabla para que contenga FFh en todas sus localidades. Elabore una tabla similar a la anterior. Tabla 5.2: Valor de las variables del programa (con la tabla llena de FFh). SUMAH SUMAL FSR LONG Pasada 1 Pasada 2 Pasada 3 Pasada 4 Pasada 5 Pasada 6 Pasada 7 Pasada 8 Pasada 9 Pasada 10 Eduardo Romero A. Laboratorio de Sistemas Digitales III 59 Direccionamiento Indirecto y Teclado Matricial 7. Analice el programa y explique ¿De qué forma se puede incrementar la cantidad de números que se pueden sumar? ________________________________________________________________________ ________________________________________________________________________ II. Teclado matricial Es un dispositivo de 16 teclas configurado con una matriz filas-columnas (figura 5.3) con la intención de reducir el número de líneas de entradas y salidas necesarias para controlarlo con el microcontrolador. En un teclado no matricial cada tecla necesita una línea de entrada, con lo cual representa una cantidad mayor de líneas de I/O del MCU. Para controlar el teclado, los puertos del MCU correspondientes a las filas se programan como salidas y los conectados a las columnas del teclado se programan como entradas. De tal forma que el objetivo principal del algoritmo para decodificar el teclado consiste en determinar la fila y columna que corresponde a la tecla que se presionó. Lo anterior se logra rotando un valor lógico (ya sea 1 ó 0) en cada una de las líneas configuradas como salidas (filas en este caso) e inmediatamente después leer el estado lógico de las líneas conectadas como entrada (columnas). Cuando el valor lógico que se rota es un 1 al algoritmo se le denomina walking ones y walking zeros cuando se trata de un 0. Figura 5.3: Conexión (parcial) del teclado matricial con el PIC16F628. Eduardo Romero A. Laboratorio de Sistemas Digitales III 60 Direccionamiento Indirecto y Teclado Matricial 8. Edite el siguiente programa con MPLAB y cree el proyecto de la forma acostumbrada. Ensamble y depure hasta que no existan errores o warnings. ; Programa que decodifica un teclado matricial de 16 teclas y entrega el ; resultado en un display de 7 segmentos conectado en puerto A. LIST RADIX p=16F628 HEX w f EQU EQU 0 1 INDF TMR_OPT PCL ESTADO FSR PORTA PORTB CMCON EQU EQU EQU EQU EQU EQU EQU EQU 0x00 0X01 0x02 0x03 0x04 0x05 0x06 0x1F TEMP1 TEMP2 CONTADOR EQU EQU EQU 30h 31h 32h ; Variables para la tabla cblock 20h CERO UNO DOS TRES CUATRO CINCO SEIS SIETE OCHO NUEVE L_A L_B L_C L_D L_E L_F Endc ORG goto 0 INICIO ;Inicio del programa en dirección ; Subrutina que inicializa la tabla con los valores ; que se deben enviar al puerto A, Para desplegar ; el número correspondiente a la tecla presionada CONF_TABLA movlw movwf 20h FSR movlw 0xDE ; CERO Eduardo Romero A. Laboratorio de Sistemas Digitales III Direccionamiento Indirecto y Teclado Matricial movwf incf INDF FSR,f movlw movwf incf 0x50 INDF FSR,f movlw movwf incf 0xCD INDF FSR,f movlw movwf incf 0xD9 INDF FSR,f movlw movwf incf 0x53 INDF FSR,f movlw movwf incf 0x9B INDF FSR,f movlw movwf incf 0x9F INDF FSR,f movlw movwf incf 0xD0 INDF FSR,f movlw movwf incf 0xDF INDF FSR,f movlw movwf incf 0xD3 INDF FSR,f movlw movwf incf 0xD7 INDF FSR,f movlw movwf incf 0x1F INDF FSR,f movlw movwf incf 0x8E INDF FSR,f movlw movwf incf 0x5D INDF FSR,f movlw movwf 0x8F INDF 61 ; UNO ; DOS ; TRES ; CUATRO ; CINCO ; SEIS ; SIETE ; OCHO ; NUEVE ; L_A ; L_B ; L_C ; L_D ; L_E Eduardo Romero A. Laboratorio de Sistemas Digitales III 62 Direccionamiento Indirecto y Teclado Matricial incf FSR,f movlw movwf incf return 0x87 INDF FSR,f ; L_F CONF_PUERTOS movlw movwf bsf movlw movwf movlw movwf bcf clrf clrf return b'00000111' CMCON ESTADO,5 b'11110000' PORTB b'00100000' PORTA ESTADO,5 PORTB PORTA ; Subrutina que rota a la izquierda ROTA_LED movf CONTADOR,w addwf PCL,f goto F0 goto F1 goto F2 goto F3 F3 movlw movwf movlw movwf return 01h PORTB 20h FSR F2 movlw movwf movlw movwf return 02h PORTB 24h FSR F1 movlw movwf movlw movwf return 04h PORTB 28h FSR F0 movlw movwf movlw movwf return 08h PORTB 2Ch FSR ; ; ; ; ; ; ; ; ; ; comparadores apagados hablilita pins de I/O conmuta a banco 1 Config. nibble_alto de PORTB y nible bajo como salida Configura el Puerto A como salida a excepción de RA5 (salida fija) conmuta a banco 0 Puerto B = 00h Puerto A = 00h la parte baja del Puerto B ; Subrutina que decodifica la tecla presiona y manda a escribir en el ; display de 7 segmentos de cátodo común ; Parámetro de entrada: variable TECLA Eduardo Romero A. Laboratorio de Sistemas Digitales III 63 Direccionamiento Indirecto y Teclado Matricial DECODIFICA swapf andlw movwf btfss goto movlw goto PORTB,w 0Fh TEMP1 TEMP1,0 SIGUE0 00h APUNTA SIGUE0 btfss goto movlw goto TEMP1,1 SIGUE1 01h APUNTA SIGUE1 btfss goto movlw goto TEMP1,2 SIGUE2 02h APUNTA SIGUE2 btfss return movlw TEMP1,3 APUNTA addwf movf movwf return 03h FSR,f INDF,w PORTA ; Rutina de retardo de 1 ms a una frecuencia ; de oscilación de 4 MHZ en el reloj interno RETARDO nop ; 1 ciclo movlw .249 ; 1 ciclo movwf TEMP2 ; 1 ciclo CICLO nop ; K ciclos decfsz TEMP2,f ; (K-1)+2 ciclos goto CICLO ; 2(K-1) ciclos return ; 2 ; Programa principal INICIO call call AKI movlw movwf CONF_TABLA CONF_PUERTOS 0xFF CONTADOR OTRA_TECLA incf btfsc goto call call call goto CONTADOR,f CONTADOR,2 AKI ROTA_LED RETARDO DECODIFICA OTRA_TECLA END Eduardo Romero A. Laboratorio de Sistemas Digitales III 64 Direccionamiento Indirecto y Teclado Matricial 9. Para la programación del microcontrolador verifique los siguientes parámetros como se muestran en la ventana de la figura 5.4. Figura 5.4: Bits de configuración para programar al PIC para el ejemplo del teclado matricial. 10. Visualice el listado del programa y escriba el nombre de todas las variables que se emplean en él. ________________________________________________________________________ ________________________________________________________________________ ________________________________________________________________________ 11. Identifique las subrutinas y escriba que es lo que hace cada una de ellas (apóyese en los comentarios que tiene el programa). Tabla 5.3. Subrutinas y su respectiva función para el manejo del teclado matricial. Subrutinas Eduardo Romero A. Función Laboratorio de Sistemas Digitales III 65 Direccionamiento Indirecto y Teclado Matricial 12. Inserte un punto de ruptura (BREAK-POINT) en la instrucción call CONF_FUERTOS (Para insertar un punto de ruptura, dar doble “click” con el ratón posicionado en la instrucción, para borrarlo dar doble “click” de nuevo). 13. Ver el contenido de los GPR’s con el menú View>> 4 file registers. Con View >> Special Function Register, se abre la ventana que nos permite ver los SFR. 14. Borre el contenido de los GPR a través del menú Debugger >> Clear Memory >> GPR’s. 15. Simule un RESET al microcontrolador, con el botón simulación del programa con el botón RUN . , a continuación ejecute la 16. Observe que cuando la simulación llega al punto de ruptura se detiene. 17. En las ventanas que muestran el contenido de los GPR’s y SFR’s se puede notar que el simulador nos indica con color rojo los registros que han cambiado. Anote el valor que tienen ahora las variables. ________________________________________________________________________ ________________________________________________________________________ 18. Ahora simule paso a paso la subrutina CONF_PUERTOS. Explique brevemente que es lo que hace. ________________________________________________________________________ ________________________________________________________________________ 19. Continué ejecutando el programa hasta que llegar a la subrutina ROTA_LED. ¿Qué valor tiene la variable CONTADOR? ________________________________________________________________________ ________________________________________________________________________ 20. Ejecute paso a paso la subrutina ROTA_LED hasta la instrucción addwf PCL, f, ¿Cuál es su función dentro del programa? ________________________________________________________________________ ________________________________________________________________________ Eduardo Romero A. Laboratorio de Sistemas Digitales III 66 Direccionamiento Indirecto y Teclado Matricial 21. En la rutina ROTA_LED hay 4 secciones de código cada una rotuladas con las etiquetas F0, F1, F2, y F3. ¿Cuál es la función que realizan? ________________________________________________________________________ ________________________________________________________________________ 22. Analice la subrutina DECODIFICA con la ayuda del simulador. Explique ¿Cómo se realiza la decodificación de la tecla pulsada? ________________________________________________________________________ ________________________________________________________________________ 23. Descargue su programa al microcontrolador e implemente el circuito. Verifique su funcionamiento. 24. Analice la conexión del puerto A con el display. ¿Por qué no se utilizó la terminal RA5/MCLR? ________________________________________________________________________ ________________________________________________________________________ 25. ¿Por qué la conexión en RA4/TOCK1/CMP2 es diferente a las demás? ________________________________________________________________________ ________________________________________________________________________ 26. Vuelva comentario la línea de código call RETARDO, ensamble y reprograme el PIC nuevamente y experimente. ¿Funciona bien el teclado? ________________________________________________________________________ Explique ¿porqué es necesaria esa línea de código? ________________________________________________________________________ ________________________________________________________________________ Eduardo Romero A. Laboratorio de Sistemas Digitales III 67 Direccionamiento Indirecto y Teclado Matricial Figura 5.5: Circuito principal del teclado matricial. Eduardo Romero A. Laboratorio de Sistemas Digitales III