8/13/2019 Practica2 FENDER
1/17
UNIVERSIDAD AUTNOMA DE YUCATN
Facul tad de Ingeniera
Dispositivos de Control
Practica 2: Puertos de Entrada y Salida
Equipo: FENDER
Integrantes:
Coln Amador, Diana Monserrat.
May Tzuc, Oscar de Jess.
Gngora Nio, Sergio.
Profesor:M en C. Mauricio Romero.
8/13/2019 Practica2 FENDER
2/17
Objetivo.
Aprender a seleccionar la configuracin adecuada para los puertos de acuerdo al hardware que se requieraconectar, as como realizar manipulaciones en los bits mediante el uso de mscaras.
Introduccin.Los Puertos de entrada y salida son el mecanismo bsico que permite a un Microcontrolador interactuar conel mundo, de su correcta configuracin depende el funcionamiento adecuado de nuestros diseos. Aunqueexisten algunos mdulos que configuran de forma automtica los puertos, existen muchos otros que no lohacen; si adems usamos hardware que no se encuentre en las bibliotecas de mdulos de usuario,necesitamos asegurarnos que todas las terminales conectadas a dicho hardware estn correctamenteconfiguradas.
En algunas aplicaciones puede llegar a ser necesario cambiar la configuracin en tiempo de ejecucin paradetectar algunas condiciones de error en los dispositivos.
El PSoC cuenta con 8 configuraciones diferentes para los puertos, algunas de las cuales funcionan de dosmaneras diferentes de acuerdo a los datos escritos en el puerto.
Para realizar las configuraciones de los puertos de entrada y salida (GPIOs a partir de ahora), contamoscon 4 registros importantes: PRTxDM0, PRTxDM1, PRTxDM2 y PRTxDR. Los tres primeros son losregistros de Modo, y configuran el tipo de Drive del puerto, y el ltimo es el registro de datos, que sirvepara escribir y leer los pines del puerto.
Cada bit de estos registros sirve para configurar una terminal del puerto de acuerdo a la siguiente tabla:
Como se ve en la tabla, el funcionamiento de las terminales, no solo depende de los registros de Modo, sinotambin del valor del registro de datos, por lo que hay que prestar atencin que al manipular los bits de unpuerto, no cambiemos accidentalmente los valores de datos de las terminales. No siempre lo que escribimos
y leemos de los puertos va a coincidir.
Dependiendo del hardware que se conecta a las terminales es el modo seleccionado.
Los Modos Strong son de SOLO SALIDA, y sirven para conectarse a dispositivos que requierenuna corriente de entrada considerable como son los LEDs, Bocinas Piezoelctricas, etc. Debemostener cuidado de nunca conectar directamente las terminales conectadas de este modo a tierra o aalimentacin, ya que corremos el riesgo de causar un corto circuito.
8/13/2019 Practica2 FENDER
3/17
El modo Hi-Z es un modo de SOLO ENTRADA. Sirve para conectarse a dispositivos digitalescuyas salidas siempre estn presentes, como puede ser un comparador, un convertidor RS232-TTL,etc. Cuando estas terminales no se encuentran conectadas a nada, su valor es indeterminado. Lasterminales no usadas del PSoC deben de configurarse en este modo, o en modo Hi-Z analgico.
El Modo Hi-Z Analgico es similar elctricamente al modo Hi-Z digital, la diferencia es que elmodo digital va conectado a un latch, para digitalizar la seal, mientras que el modo analgico envadirectamente la seal hacia la seccin analgica del chip. Este modo ES BIDIRECCIONAL, Sufuncionamiento como entrada o salida depende de las conexiones internas en la seccin analgica.
El modo Pull-Up es BIDIRECCIONAL. Dependiendo de como se conecte y del valor del registroPRTxDR, puede funcionar como entrada y/o salida. Una terminal conectada en este modo no debeconectarse directamente a alimentacin, ya que podra ocurrir un corto circuito. Para poder usaresta configuracin como entrada, debemos escribir un 1 en el bit del registro PRTxDR que
corresponda a la terminal que queremos leer, ya que de esa manera el valor ledo ser el del valor
lgico de la terminal. Este modo se suele usar para conectar Interruptores o para dispositivosbidireccionales como son los LCDs.
El modo Pull-Down es BIDIRECCIONAL. Dependiendo de como se conecte y del valor del registroPRTxDR, puede funcionar como entrada y/o salida. Una terminal conectada en este modo no debeconectarse directamente a tierra, ya que podra ocurrir un corto circuito. Para poder usar estaconfiguracin como entrada, debemos escribir un 0 en el bit del registro PRTxDR quecorresponda a la terminal que queremos leer, ya que de esa manera el valor ledo ser el del valorlgico de la terminal. Este modo se suele usar para conectar Interruptores o para dispositivosbidireccionales como son los LCDs.
El modo Open Drain Drives High es BIDIRECCIONAL. Dependiendo de como se conecte y delvalor del registro PRTxDR, puede funcionar como entrada y/o salida. Una terminal conectada eneste modo no debe conectarse directamente a tierra, ya que podra ocurrir un corto circuito. Parapoder usar esta configuracin como entrada, debemos escribir un 0 en el bit del registro PRTxDR
que corresponda a la terminal que queremos leer, ya que de esa manera el valor ledo ser el delvalor lgico de la terminal. Cuando se usa como entrada esta entrada es de tipo Hi-Z, por lo queno debe de estar flotando. Este modo se suele usar para conectarse a buses de datosbidireccionales.
El modo Open Drain Drives Low es BIDIRECCIONAL. Dependiendo de como se conecte y del valordel registro PRTxDR, puede funcionar como entrada y/o salida. Una terminal conectada en estemodo no debe conectarse directamente a alimentacin, ya que podra ocurrir un corto circuito. Parapoder usar esta configuracin como entrada, debemos escribir un 1 en el bit del registro PRTxDR
que corresponda a la terminal que queremos leer, ya que de esa manera el valor ledo ser el delvalor lgico de la terminal. Cuando se usa como entrada esta entrada es de tipo Hi -Z, por lo queno debe de estar flotando. Este modo se suele usar para conectarse a buses de datosbidireccionales.
8/13/2019 Practica2 FENDER
4/17
Desarrollo.
Se cconecta un Dip Switch de 4 interruptores y 4 leds como se muestra en el siguiente diagrama deconexiones.
Iniciaremos creando un proyecto en C y le Llamaremos Practica2a. En este Proyecto usaremos el mdulo
de LCD (y el de LED en caso de que el LCD tenga Luz), no utilizaremos la barra y lo conectaremos al puerto
2 con los mismos parmetros de la prctica anterior. Despus de configurar los mdulos, configuraremos el
Puerto 1 usando la interfaz grfica del Designer.
Se dan la siguiente configuracin para los puertos (segn el orden de la practica primero se prueba con el Z
analgico y posteriormente con el digital):
8/13/2019 Practica2 FENDER
5/17
Esta configuracin se aplica en el archivo boot.asm, y se quedar fija a menos que la cambiemos en tiempode ejecucin por medio de los registros.
Escribimos el cdigo que se muestra a continuacin y presiona el botn Generate/Build.
#include // part specific constants and macros
#include"PSoCAPI.h" // PSoC API definitions for all User Modulesvoidmain(void){
LCD_Start();LED_Start();LED_On();LCD_PrCString("Practica GPIOs");PRT1DR=0x5F;while(1){
LCD_Position(1,0);LCD_PrHexByte(PRT1DR);
}}
Que hace este programa?:
Segn el cdigo este programa debe de escribir en la primera lnea del LCD la practica que se est
realizando, posteriormente segn la instruccin que se ingresa al Puerto 1, se espera que se enciendan dos
de los LEDs y que en la segunda lnea del LCD se visualice el valor en hexadecimal ingresado en el puerto 1
a travs del dip switch.
Se comporta como esperabas?:
En ambas circunstancias el programa compil y se cargo sin ningn problema en el microcontrolador, no
obstante nose observaron los resultados esperados debido a:
Hi- Z Analgico No entra al buffer digital.
Hi-Z Debido a que escrituras al registro PRTxDR en este modo no tienen efecto.
Cambia Otra vez la Configuracin de los puertos a:
8/13/2019 Practica2 FENDER
6/17
Se comporta como esperabas el programa? Cambia el funcionamiento, si el comn del dipswitch lo cambias entre tierra y alimentacin? Por qu?
Despus de esta ultima modificacin el circuito tal y como estaba
descrito al principio, esto debido a que la configuracin de Pull-
Up es una configuracin de entrada, por lo cual reconoce los
estados lgicos alto y bajo.
Cada vez que se mueve el dip switch a on el pin cambia de High a
Low, si se llegase a cambiar el comn del dip switch a Vcc, no
veramos ningn cambio debido a que el pin estara en estado
High y al mover el switch ste serpia alimentado con Vcc.
0 1 0 1 1 1 1 1
0 0 0 0
Bits LedsBits Dip Switch(PULL
UP)
1
1
1
1
1
0
0
0
0
8/13/2019 Practica2 FENDER
7/17
Cambia Otra vez la Configuracin de los puertos a:
Cambia la lnea 13 del programa de: PRT1DR=5F; a PRT1DR=50;. Compila y corre ahorael programa y mueve los interruptores a diferentes posiciones. Se comporta comoesperabas el programa? Cambia el funcionamiento, si el comn del dip switch lo cambias
entre tierra y alimentacin? Porque?Despus de haber observado el comportamiento con el Pull-Up, se dedujo la forma en que funcionara el
Pull-Down, misma que despus de compilar y cargar el programa fue confirmada.
El cambio de 5F a 50 en el puerto 1 se realiz para colocar en ceros los pines asignados al dip switch, lo
cual es necesario cuando se trabaja en configuracin de pull- down.
Cuando conectamos los dips switchs a tierra ocurre algo similar en el caso anterior cuando no funciona el
pull-up. Al estar referenciados a 0V, cuando se mueve el switch este lo tira a tierra, por lo cual no hay
cambios.
Cuando los dips switchs estn conectados a Vcc, al mover el switch cambia el estado lgico, lo cual se puedevisualizar en la LCD.
Conservando la misma configuracin copia el siguiente cdigo:
#include // part specific constants and macros#include"PSoCAPI.h" // PSoC API definitions for all User Modules
8/13/2019 Practica2 FENDER
8/17
voidmain(void){
LCD_Start();LED_Start();LED_On();LCD_PrCString("Practica GPIOs");
while(1){LCD_Position(1,0);LCD_PrHexByte(PRT1DR);PRT1DR=PRT1DR
8/13/2019 Practica2 FENDER
9/17
Por qu fue necesario usar una OR con la mscara?
Como ya se explic, la accin del corrimiento eliminaba la configuracin del pull-up por lo cual era necesario
el uso de una mascar para asignarle esos valores al puerto 1. Para ello se us el OR (|), el cual compara los
valores en formato binario de cada operador y se obtiene un valor cuyo bit muestra patrn que los bits en
cualquiera de los operandos tiene el valor 1. Si los dos bits son 0, el resultado de ese bit es 0, de locontrario, el resultado es 1.
Crea un nuevo Proyecto en ensamblador y llmalo Practica2b. Conecta 8 LEDs al puerto 1 como semuestra en la figura, y escribe el siguiente cdigo.
nclude"m8c.inc" ; part specific constants and macrosinclude"memory.inc" ; Constants & macros for SMM/LMM and Compilerinclude"PSoCAPI.inc" ; PSoC API definitions for all User Modulesexport_mainLedpares: equ0b01010101Ledimpares: equ0b10101010areabss(RAM)Pausa:blk1areatext(ROM,REL)_main:
callLCD_StartcallLED_StartcallLED_On
Cicloprincipal:
movreg[PRT1DR],LedparescallPausaSoftwaremovreg[PRT1DR],LedimparescallPausaSoftwarejmpCicloprincipal
;________________________________Subrutina____________________________
PausaSoftware:mov[Pausa],200loop:
movA,100callLCD_Delay50uTimes
dec[Pausa]jnzloopret
8/13/2019 Practica2 FENDER
10/17
Ejectalo. Funciona el cdigo? Qu le hace
falta?El cdigo funcion perfectamente al primer
intento ya que consideramos la configuracin de los pines del puerto 1, los cuales fueron colocados en modo
strong para as fungir como salidas para dispositivos como los LEDs.
Aumenta el siguiente Cdigo:
;configuracion manual de los puertos de ejecucionmovreg[PRT1DM2],0b00000000M8C_SetBank1movreg[PRT1DM1],0b00000000
movreg[PRT1DM0],0b11111111M8C_SetBank0
8/13/2019 Practica2 FENDER
11/17
Para que sirven las macros M8C_SetBank1 y M8C_SetBank0, y porque las necesitamos ennuestro programa? (Checa el manual de referencia de la familia CY8C29xxx)
PSoC1 tiene dos bytes de 256 pginas que soportan los registros del mdulo de usuario. Algunos de ellos seencuentran en el banco 0 y algunos en el banco 1. Cada vez que un registro se menciona en el texto del
dispositivo o mdulo de usuario hojas de datos, hay una indicacin de si se trata en el banco 0 o banco1. Por lo tanto, es necesario que est en el banco apropiado para la ejecucin de una instruccin en el
registro. M8C_SetBank1 macro establece la pgina de macro para el banco 1 y M8C_SetBank0 establece la
pgina de banco 0.
Bank 0 de registros son ms propensos modificado durante la ejecucin del cdigo de usuario no durante lainicializacin y por lo tanto se han nombrado como registros de espacio de usuario. Por el contrario, los
bancos 1 registros son ms propensos modificado durante la inicializacin no durante la ejecucin y por lotanto se han nombrado como registros de espacio de configuracin.
Por ejemplo, cada bloque digital tiene las siguientes 7 registros:1. Funcin de registro2. Registro de entrada3. Registro de salida4. DR0 Registrarse5. DR1 Registrarse6. DR2 Registrarse7. CR0 Registrarse
De los ms de 7 registros de funciones, de entrada y de salida se colocan en el banco 1 y DR0, DR1 DR2 yCR0 registros se colocan en Bank0.
En Ensamblador crea un programa para leer un teclado matricial en el puerto 1. El programa principaldeber de leer el teclado y desplegar en la pantalla de LCD el mensaje Presionando: y la tecla que se
haya presionado, durante el tiempo que se mantenga presionada. Cuando no haya ninguna tecla presionada,se deber desplegar el mensaje Presione una Tecla. Se deber hacer una subrutina de lectura de tecladollamada ReadKeys que deber regresar en el acumulador el cdigo ASCII de la tecla apretada. En caso deque no se presione ninguna tecla, la subrutina deber regresar cero (0x00).
En la siguiente Figura se muestra el diagrama de conexin de un teclado matricial. Estos teclados puedencomprarse, ya que se usan en una gran cantidad de dispositivos como los telfonos, cajeros automticos,cerraduras de seguridad, etc.
8/13/2019 Practica2 FENDER
12/17
Para leer un teclado matricial, pon las columnas como salida y las filas como entradas con Pull-Up. Escribecero a todas las salidas y lee las entradas. En la fila donde se haya presionado una tecla va a aparecer uncero. Despus configura las filas como salidas y las columnas como entradas con Pull-Up y escribe cero a las
salidas de nuevo. Lee las entradas, y donde a parezca un cero esa es la columna del interruptor que sepresion. Con los resultados de las dos lecturas anteriores, podemos saber la fila y la columna delinterruptor presionado, y por lo tanto, sabemos que tecla fue presionada. Este algoritmo tambin se puedecambiar para que las teclas se activen con uno lgico en lugar de cero, pero hay que cambiar la
configuracin de las entradas a Pull-Down.
Como en el PSoC la configuracin Pull-Up es bidireccional, no es necesario cambiar la configuracin de lasterminales de entrada a salida, sino se mantienen en Pull-Up.
;-----------------------------------------------------------------------------; Assembly main line;-----------------------------------------------------------------------------
include"m8c.inc" ; part specific constants and macrosinclude"memory.inc" ; Constants & macros for SMM/LMM and Compilerinclude"PSoCAPI.inc" ; PSoC API definitions for all User Modulesbit0: equ0b00000001 ;creamos constantes a las cuales se lesasignar un valor de bitbit1: equ0b00000010bit2: equ0b00000100bit3: equ0b00001000bit4: equ0b00010000bit5: equ0b00100000bit6: equ0b01000000export_mainareabss(RAM) ;indicamos que trabajaremos en la memoria RAMtiempo:blk1 ;creamos una variable de nombre tiempo de unbyteareatext(ROM,REL) ;indicamos los espacios de memoria ROM_main:;___________________inicio del programa principal_____________________
callLCD_Start ;iniciamos la lcdcallLED_Start ;iniciamos el led
nada: ;creamos un ciclo principalmovA,bit0
8/13/2019 Practica2 FENDER
13/17
callLCD_Control ;limpiamos la pantallamovA,00hmovX,00hcallLCD_Position ;posicionamos el cursormovA,> Tabla1movX,< Tabla1callLCD_PrCString ;imprimimos el mensaje
callReadKeys ;llamamos a la subrutinacalldelay ;hacemos un retardo
jmpnada ;se reinicia el ciclo
;___________________________subrutinas_________________________________
ReadKeys:
movreg[PRT1DR],0x0F ;coloco cero en filas y 1 en columnaststreg[PRT1DR],bit0, ;hago un test con & bit a bitjzcol0 ;si se activida la badera me voy a la subrutinamovreg[PRT1DR],0x0F ;coloco cero en filas y 1 en columnaststreg[PRT1DR],bit1
jzcol1movreg[PRT1DR],0x0F ;coloco cero en filas y 1 en columnaststreg[PRT1DR],bit2jzcol2movreg[PRT1DR],0x0F ;coloco cero en filas y 1 en columnaststreg[PRT1DR],bit3jzcol3ret ;regreso a la rutina principal;-----codigo para col0------col0:
mov reg[PRT1DR],0xFE ;donde se colocan 1111 a las columnas y yasabemos que es la fil 0
tstreg[PRT1DR],bit4 ;test con & haciendo bit a bitjnzcol0fil1 ;si la bandera de zero no es cero brinca a
col0fil1callescribir ;llamamos a la subrutina escribirmovA,'1'callLCD_WriteData ;imprimos el valor es ASCIIret ;regresamos a readkeys
col0fil1:tstreg[PRT1DR],bit5jnzcol0fil2callescribirmovA,'2'callLCD_WriteDataret
col0fil2:
tstreg[PRT1DR],bit6jnzcol0fil3callescribirmovA,'3'callLCD_WriteDataret
col0fil3:callescribirmovA,'A'callLCD_WriteData
8/13/2019 Practica2 FENDER
14/17
ret;---------codigo para col1-----------col1:
mov reg[PRT1DR],0xFD ;donde se colocan 1111 a las columnas y yasabemos que es la fil 1
tstreg[PRT1DR],bit4jnzcol1fil1
callescribirmovA,'4'callLCD_WriteDataret
col1fil1:tstreg[PRT1DR],bit5jnzcol1fil2callescribirmovA,'5'callLCD_WriteDataret
col1fil2:tstreg[PRT1DR],bit6
jnzcol1fil3callescribirmovA,'6'callLCD_WriteDataret
col1fil3:callescribirmovA,'B'callLCD_WriteDataret
;codigo para col2col2:
mov reg[PRT1DR],0xFB ;donde se colocan 1111 a las columnas y yasabemos que es la fil 2
tstreg[PRT1DR],bit4jnzcol2fil1callescribirmovA,'7'callLCD_WriteDataret
col2fil1:tstreg[PRT1DR],bit5jnzcol2fil2callescribirmovA,'8'callLCD_WriteDataret
col2fil2:tstreg[PRT1DR],bit6jnzcol2fil3callescribirmovA,'9'callLCD_WriteDataret
col2fil3:callescribirmovA,'C'
8/13/2019 Practica2 FENDER
15/17
callLCD_WriteDataret
;codigo para col3col3:
mov reg[PRT1DR],0xF7 ;donde se colocan 1111 a las columnas y yasabemos que es la fil 3
tstreg[PRT1DR],bit4
jnzcol3fil1callescribirmovA,'*'callLCD_WriteDataret
col3fil1:tstreg[PRT1DR],bit5jnzcol3fil2callescribirmovA,'0'callLCD_WriteDataret
col3fil2:
tstreg[PRT1DR],bit6jnzcol3fil3callescribirmovA,'#'callLCD_WriteDataret
col3fil3:callescribirmovA,'D'callLCD_WriteDataret
escribir: ;la subrutina escribir nos servir cuando se hayapresionado una tecla
movA,bit0 ;esta escribir la leyenda "tecla presionada" ycorrer el espacio para ingresar
callLCD_Control ;en la siguiente fila el valor en asciimovA,00hmovX,00hcallLCD_PositionmovA,>Tabla2movX,
8/13/2019 Practica2 FENDER
16/17
.literal ;creamos la tabla con leyendas en ROMTabla1: ASCIZ"Presione tecla:"Tabla2:ASCIZ "Presionando:"
.endliteral
8/13/2019 Practica2 FENDER
17/17
BIBLIOGRAFA.
Mauricio Romero. Gua de Practicas de Dispositivos de Control. Practica 2.- Puertos de entrada ysalida.
IBM. "XL C/C++ V7.0 for AIX".Recuperado de :http://publib.boulder.ibm.com/infocenter/comphelp/v7v91/index.jsp?topic=%2Fcom.ibm.vacpp7a.d
oc%2Flanguage%2Fref%2Fclrc05bitiore.htm
Cypress. "AN2094 - PSoC 1 - Conceptos bsicos del GPIO". Recuperado de:http://www.cypress.com/?rID=2900
Cypress."PSoC 1 GPIO Demystified - Parte 2". Recuperado de:http://www.cypress.com/?rID=39497
Cypress. C lenguaje compiler user guide. Recuperado de la documentacin de PsoC. Cypress. Assembly lenguaje user guide. Recuperado de la documentacin de PsoC. Cypress. How to Swap Register Bank. Recuperado de:http://www.cypress.com/?id=4&rID=33795 Cypress. Difference between bank0 and bank1 register. Recuperado de:
http://www.cypress.com/?id=4&rID=39812
http://publib.boulder.ibm.com/infocenter/comphelp/v7v91/index.jsp?topic=%2Fcom.ibm.vacpp7a.doc%2Flanguage%2Fref%2Fclrc05bitiore.htmhttp://publib.boulder.ibm.com/infocenter/comphelp/v7v91/index.jsp?topic=%2Fcom.ibm.vacpp7a.doc%2Flanguage%2Fref%2Fclrc05bitiore.htmhttp://publib.boulder.ibm.com/infocenter/comphelp/v7v91/index.jsp?topic=%2Fcom.ibm.vacpp7a.doc%2Flanguage%2Fref%2Fclrc05bitiore.htmhttp://www.cypress.com/?rID=2900http://www.cypress.com/?rID=2900http://www.cypress.com/?rID=39497http://www.cypress.com/?rID=39497http://www.cypress.com/?id=4&rID=33795http://www.cypress.com/?id=4&rID=33795http://www.cypress.com/?id=4&rID=33795http://www.cypress.com/?id=4&rID=39812http://www.cypress.com/?id=4&rID=39812http://www.cypress.com/?id=4&rID=39812http://www.cypress.com/?id=4&rID=33795http://www.cypress.com/?rID=39497http://www.cypress.com/?rID=2900http://publib.boulder.ibm.com/infocenter/comphelp/v7v91/index.jsp?topic=%2Fcom.ibm.vacpp7a.doc%2Flanguage%2Fref%2Fclrc05bitiore.htmhttp://publib.boulder.ibm.com/infocenter/comphelp/v7v91/index.jsp?topic=%2Fcom.ibm.vacpp7a.doc%2Flanguage%2Fref%2Fclrc05bitiore.htm