Practica 2 - Puertos de Entrada y Salida
Practica 2 - Puertos de Entrada y Salida
Practica 2 - Puertos de Entrada y Salida
Aprender a seleccionar la configuración adecuada para los puertos de acuerdo al hardware que se requiera
conectar, así como realizar manipulaciones en los bits mediante el uso de máscaras.
Introducción.
Los Puertos de entrada y salida son el mecanismo básico que permite a un Microcontrolador interactuar con el
mundo, de su correcta configuración depende el funcionamiento adecuado de nuestros diseños. Aunque existen algunos
módulos que configuran de forma automática los puertos, existen muchos otros que no lo hacen; si además usamos
hardware que no se encuentre en las bibliotecas de módulos de usuario, necesitamos asegurarnos que todas las
terminales conectadas a dicho hardware estén correctamente configuradas.
En algunas aplicaciones puede llegar a ser necesario cambiar la configuración en tiempo de ejecución para
detectar algunas condiciones de error en los dispositivos.
El PSoC cuenta con 8 configuraciones diferentes para los puertos, algunas de las cuales funcionan de dos
maneras 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), contamos con 4
registros importantes: PRTxDM0, PRTxDM1, PRTxDM2 y PRTxDR. Los tres primeros son los registros de Modo, y
configuran el tipo de Drive del puerto, y el último es el registro de datos, que sirve para 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:
PRTxDR
PRTxDM2 PRTxDM1 PRTxDM0 Drive
=1 =0
0 0 0 Pull - Down 5V Pull Down
0 0 1 Strong 5V 0V
0 1 0 Hi-Z Hi – Z Hi - Z
0 1 1 Pull - Up Pull - Up 0V
1 0 0 Open Drain Drives High 5V Hi - Z
1 0 1 Strong Slow 5V 0V
1 1 0 Hi – Z Analógica Hi – Z Hi - Z
1 1 1 Open Drain Drives Low Hi – Z 0V
Como se ve en la tabla, el funcionamiento de las terminales, no solo depende de los registros de Modo, sino
también del valor del registro de datos, por lo que hay que prestar atención que al manipular los bits de un puerto, no
cambiemos accidentalmente los valores de datos de las terminales. No siempre lo que escribimos y leemos de los
puertos va a coincidir.
Los Modos “Strong” son de SOLO SALIDA, y sirven para conectarse a dispositivos que requieren una corriente
de entrada considerable como son los LEDs, Bocinas Piezoeléctricas, etc. Debemos tener cuidado de nunca conectar
directamente las terminales conectadas de este modo a tierra o a alimentación, ya que corremos el riesgo de causar un
corto circuito.
El modo “Hi-Z” es un modo de SOLO ENTRADA. Sirve para conectarse a dispositivos digitales cuyas salidas
siempre están presentes, como puede ser un comparador, un convertidor RS232-TTL, etc. Cuando estas terminales no
se encuentran conectadas a nada, su valor es indeterminado. Las terminales no usadas del PSoC deben de configurarse
en este modo, o en modo Hi-Z analógico.
El Modo “Hi-Z Analógico” es similar eléctricamente al modo Hi-Z digital, la diferencia es que el modo digital va
conectado a un latch, para digitalizar la señal, mientras que el modo analógico envía directamente la señal hacia la
sección analógica del chip, por lo que estas terminales NO PUEDEN LEERSE DIGITALMENTE. Este modo ES
BIDIRECCIONAL, Su funcionamiento como entrada o salida depende de las conexiones internas en la sección analógica.
El modo “Pull-Up” es BIDIRECCIONAL. Dependiendo de como se conecte y del valor del registro PRTxDR,
puede funcionar como entrada y/o salida. Una terminal conectada en este modo no debe conectarse directamente a
alimentación, ya que podría ocurrir un corto circuito. Para poder usar esta configuración 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
leído será el del valor lógico de la terminal. Este modo se suele usar para conectar Interruptores o para dispositivos
bidireccionales como son los LCDs.
El modo “Pull-Down” es BIDIRECCIONAL. Dependiendo de como se conecte y del valor del registro PRTxDR,
puede funcionar como entrada y/o salida. Una terminal conectada en este modo no debe conectarse directamente a
tierra, ya que podría ocurrir un corto circuito. Para poder usar esta configuración 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 leído será
el del valor lógico de la terminal. Este modo se suele usar para conectar Interruptores o para dispositivos bidireccionales
como son los LCDs.
El modo “Open Drain Drives High” es BIDIRECCIONAL. Dependiendo de como se conecte y del valor del registro
PRTxDR, puede funcionar como entrada y/o salida. Una terminal conectada en este modo no debe conectarse
directamente a tierra, ya que podría ocurrir un corto circuito. Para poder usar esta configuración 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 leído será el del valor lógico de la terminal. Cuando se usa como entrada esta entrada es de tipo “Hi-Z”, por lo que
no debe de estar flotando. Este modo se suele usar para conectarse a buses de datos bidireccionales.
El modo “Open Drain Drives Low” es BIDIRECCIONAL. Dependiendo de como se conecte y del valor del registro
PRTxDR, puede funcionar como entrada y/o salida. Una terminal conectada en este modo no debe conectarse
directamente a alimentación, ya que podría ocurrir un corto circuito. Para poder usar esta configuración 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 leído será el del valor lógico de la terminal. Cuando se usa como entrada esta entrada es de tipo “Hi-Z”,
por lo que no debe de estar flotando. Este modo se suele usar para conectarse a buses de datos bidireccionales.
Conexiones.
Conecta un Dip Switch de 4 interruptores y 4 leds como se muestra en el siguiente diagrama de conexiones.
Figura 1
Desarrollo.
LCD , no utilizaremos la barra y lo conectaremos al puerto 2 con los mismos parámetros de la práctica anterior.
Figura 2
Después de configurar los módulos, configuraremos el Puerto 1 usando la interfaz gráfica del Designer. Lo
podemos hacer de 2 maneras. La primera es en la ventana de configuración de terminales. En ella podemos configurar
cada terminal para asignarle el drive, valor inicial, conexión a los buses, y asignarle un nombre simbólico para usarlo
cuando nos queramos referir a esa terminal.
Figura 3
La otra manera de configurar las terminales es en la sección de los módulos e interconexiones internas. Solo
damos clic izquierdo a la terminal que queremos configurar y saldrá un menú con las opciones correspondientes.
Figura 4
Figura 5
MC. Edgar Mauricio Romero López
Dispositivos de Control. Guía de Practicas.
Esta configuración se aplica en el archivo boot.asm, y se quedará fija a menos que la cambiemos en tiempo de
ejecución por medio de los registros.
Figura 6
ANTES DE GRABAR EL PROGRAMA; VERIFICA QUE LOS SWITCHES QUE VAN A P1.1 y P1.0 ESTEN ABIERTOS
Corre ahora el programa y mueve los interruptores a diferentes posiciones. ¿Se comporta como esperabas el programa?
¿Porque?
Figura 7
MC. Edgar Mauricio Romero López
Dispositivos de Control. Guía de Practicas.
Corre ahora el programa y mueve los interruptores a diferentes posiciones. ¿Se comporta como esperabas el programa?
¿Porque?
Figura 8
Corre ahora el programa y mueve los interruptores a diferentes posiciones. ¿Se comporta como esperabas el programa?
¿Cambia el funcionamiento, si el común del dip switch lo cambias entre tierra y alimentación? ¿Porque?
Figura 9
Cambia la línea 13 del programa de: “PRT1DR=5F;” a “PRT1DR=50;”. Compila y corre ahora el programa y mueve los
interruptores a diferentes posiciones. ¿Se comporta como esperabas el programa? ¿Cambia el funcionamiento, si el
común del dip switch lo cambias entre tierra y alimentación? ¿Porque?
Ahora, conservando esta ultima configuración de puertos, deja el común de los dip switches en alimentación. NO LO
CAMBIES A TIERRA. Copia el siguiente código:
Figura 10
Cambia La configuración de los puertos a Pull – Up de nuevo (Como en la figura 8). Cambia el común de los dip switches
a tierra. NO LO REGRESES A ALIMENTACION POR NINGUN MOTIVO O CORRES EL RIESGO DE QUEMAR LOS PUERTOS DE
ENTRADA. Vuelve a compilar y correr el código. ¿Qué sucede ahora? ¿A que se deben que ya no funcione el programa?;
¿Porque no debes de cambiar el común a alimentación?
Figura 11
Como puedes ver, al manipular bits individuales dentro de un puerto, es necesario tener en cuenta la configuración
eléctrica de todo el puerto, para evitar problemas que cambien el funcionamiento de nuestro circuito.
Crea un nuevo Proyecto en ensamblador y llámalo Practica2b. Conecta 8 LEDs al puerto 1 como se muestra en la figura,
y escribe el siguiente código.
Figura 12
Figura 13
¿Para que sirven las macros M8C_SetBank1 y M8C_SetBank0, y porque las necesitamos en nuestro programa? (Checa el
manual de referencia de la familia CY8C29xxx)
Este código nos permite cambiar la configuración de los puertos, cambiando directamente sus registros de
configuración, por lo que podemos cambiar cuantas veces queramos la configuración, aun cuando el programa se esta
ejecutando.
En Ensamblador crea un programa para leer un teclado matricial en el puerto 1. El programa principal deberá 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 teclado llamada “ReadKeys” que deberá regresar en
el acumulador el código ASCII de la tecla apretada. En caso de que no se presione ninguna tecla, la subrutina deberá
regresar cero (0x00).
En la Figura 14 se muestra el diagrama de conexión de un teclado matricial. Estos teclados pueden comprarse,
ya que se usan en una gran cantidad de dispositivos como los teléfonos, cajeros automáticos, cerraduras de seguridad,
etc.
Fila 1
Fila 2
Fila 3
Fila 4
Figura 14
Para leer un teclado matricial, pon las columnas como salida (Strong) y las filas como entradas con Pull-Up.
Escribe cero a todas las salidas y lee las entradas. En la fila donde se haya presionado una tecla va a aparecer un cero.
Después 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 se presionó. Con los resultados de las
dos lecturas anteriores, podemos saber la fila y la columna del interruptor presionado, y por lo tanto, sabemos que tecla
fue presionada. Este algoritmo también se puede cambiar para que las teclas se activen con uno lógico en lugar de cero,
pero hay que cambiar la configuración de las entradas a Pull-Down.
Figura 15