Como se mencionó anteriormente, para los microcontroladores de tipo PIC, se utilizan dos registros para configurar los pines como entradas o salidas. El registro TRISx sirve para configurar si la terminal es entrada o salida, mientras que el registro PORTx sirve para escribir un valor de salida o leer un valor de entrada.
Cada uno de estos registros está conformado por 8 bits. En este punto es importante mencionar que cada uno de los bits se puede modificar de forma independiente. Es decir, cada bit se puede configurar como entrada o salida. De igual forma es posible configurar todo el puerto completo. La selección que que opción usar dependerá de las necesidades del proyecto.
Para los microcontroladores PIC, un 1 en los TRISx configura el pin correspondiente como entrada digital, mientras que un 0 en un bit del TRISx configura el pin como salida. Es posible poner todo el puerto en b"00000000" para salidas o en b"11111111" para poner todo el puerto como entrada, o es posible tener combinaciones como b"01010101" lo que hace que los pines sean salida/entrada/salida/entrada y así. Algunos puertos comparten funciones analógicas, con estos puertos hay que tener el cuidado de verificar que no este activa la función analógica si se desea utilizar la terminal con su función digital.
LO MENCIONAMOS AQUI, AUNQUE AÚN NO ES TIEMPO, PERO EN ARDUINO, LA CONFIGURACIÓN EN LOS MICROCONTROLADORES DE ATMEL ES AL REVÉS, PARA CONFIGURAR UN PIN COMO ENTRADA LOS BITS DEL REGISTRO DDRX SE PONE EN CERO, MIENTRAS QUE PARA CONFIGURARLO COMO SALIDA SE PONEN EN 1.
Configuración de los registros TRISx y PORTx
La configuración de los registros TRISx y PORTx dependerá del lenguaje con el que se este programando el microcontrolador.
MPLABx con el compilador XC8, XC16 o XC32
Para acceder a los registros TRIS y PORT con MPLABx y sus compiladores XC es posible acceder a través de su nombre asignado en la hoja de datos (para acceder a todo el registro) o es posible acceder a cada uno de los bits de forma independiente a través de una estructura organizada por el nombre del puerto y el nombre del pin.
Por ejemplo, si se quisiera usar todo el puerto D (PORTD) como salida se tendría que configurar el registro TRISD todo en ceros.
Para modificar el estado de salida en el puerto D se tiene que hacer una escritura en el registro PORTD (para seguir con el ejemplo).
En este ejemplo los pines del puerto D son RD7, RD6, RD5, RD4, RD3, RD2, RD1, y RD0. Con el valor que se asignó en el ejemplo RD7 estaría en 0, RD6 en 1, RD5 en 0, RD4 en 1, RD3 en 0, RD2 en 1, RD1 en 1 y RD0 en 0.
Si una terminal se configura como entrada en el registro TRISx y se hace una escritura a esta terminal en el registro PORTx, esta escritura no surgirá ningún efecto. De igual manera si una terminal se configura como salida en el TRISx y se hace una lectura en el registro PORTx, se obtendrá la lectura del último valor que se escribió en este puerto.
Manipulación de pines de forma individual
Para manipular los pines de forma individual hay dos opciones, su uso dependerá de la comodidad del programador. Se puede hacer una modificación al registro completo a través de una máscara para modificar un solo bit, o se puede modificar directamente un solo bit. En este curso se considerará inicialmente esta última opción.
La estructura para acceder al bit en MPLABx es "nombre_del_registro"+bits+.+nombre del bit.
TRISCbits.TRISC3
Y se le asigna un valor binario de 1 o 0. En este ejemplo al bit TRISC3 se le asigna un valor de 0 para configurarlo como salida.
De igual forma para asignar un valor de salida al pin x del puerto se realiza de la misma forma pero con el nombre del registro PORTx.
LECTURA DE PINES DIGITALES DE MICROCONTROLADORES PIC
Si un pin está configurado como entrada su estado (alto o bajo, 1 o 0) se puede leer directamente. Es decir:
Es una instrucción que ya consulta el estado del bit RD0. No es necesario especificar la comparativa a 1 por que la lectura del bit ya nos regresa un 1 o un 0 lógico. Aún así muchas personas agregamos la comparativa para estar seguros de lo que estamos haciendo (me incluyo, aunque quizá deje de hacerlo por que consume instrucciones extra*).
De manera semejante a la escritura completa del puerto, se puede hacer una lectura completa del puerto. Por ejemplo, si se configura todo un puerto como entrada, por ejemplo TRISD = 0xFF; se puede hacer la lectura completa y simultanea de los 8 bits del puerto.
Si bien la lectura de un puerto se puede almacenar en una variable de tipo entero (int) es necesario revisar el tipo de datos que soporta el compilador y de que forma implementa cada una de los tipos de variables, por ejemplo si un int en XC8 es de 16 bits, significa que al asignar el valor de un puerto a la variable "x" entonces se están desperdiciando los 8 bits más significativos. Si solamente se van a manejar los 8 bits del puerto es común asignarlos a una variable char que siempre es de 8 bits.
ASIGNACIONES MIXTAS DE ENTRADAS EN UN MISMO PUERTO
Algunos dispositivos pueden ser manejados de forma eficiente (rápida) si se utiliza un mismo puerto, por ejemplo teclados o pantallas. Igual se pueden manejar con pines asignados en diferentes pines pero esto requiere una mayor cantidad de instrucciones y por lo tanto un programa más lento (ojo, a veces es insignificante la diferencia de tiempo, LA APLICACIÓN y la visión del programador decidirán que método utilizar).
Por ejemplo, se quiere utilizar la mitad del puerto como entrada y la mitad más significativa como salida. Por lo tanto, el registro TRISD se deberá configurar de la siguiente manera.
Una escritura al PORTD afectará los bits que están configurados como salida (los 4 más significativos) sin importar si se manda algún valor a los bits que están configurados como entrada. Una lectura nos regresará el estado de todos los bits del puerto, los que están configurados como entradas regresarán el valor del estado lógico que tengan conectado, mientras que los que están configurados como salida nos regresarán el último valor que fue escrito en el puerto (en esos bits de salida). En arduino existe el registro bits que nos ayuda a hacer la lectura del estado del puerto de forma segura.
Para el manejo de puertos de forma parcial las siguientes herramientas son muy útiles:
Máscaras con and, or, xor y not
Desplazamientos binarios
En general, operaciones a nivel a bit