3.3 Puertos De Entrada/salida
Una de las características más importantes del microcontrolador es el número de los pines de entrada/salida, que permite conectarlo con los periféricos. El PIC16F887 tiene en total 35 pines de E/S de propósito general, lo que es suficiente para la mayoría de las aplicaciones.
Con el propósito de sincronizar el funcionamiento de los puertos de E/S con la organización interna del microcontrolador de 8 bits, ellos se agrupan, de manera similar a los registros, en cinco puertos denotados con A, B, C, D y E. Todos ellos tienen las siguientes características en común:
- Por las razones prácticas, muchos pines de E/S son multifuncionales. Si un pin realiza una de estas funciones, puede ser utilizado como pin de E/S de propósito general.
- Cada puerto tiene su propio registro de control de flujo, o sea el registro TRIS correspondiente: TRISA, TRISB, TRISC etc. lo que determina el comportamiento de bits del puerto, pero no determina su contenido. Al poner a cero un bit del registro TRIS (bit=0), el pin correspondiente del puerto se configurará como una salida. De manera similar, al poner a uno un bit del registro TRIS (bit=1), el pin correspondiente del puerto se configurará como una entrada. Esta regla es fácil de recordar: 0 = Salida 1 = Entrada.
Registros PORTA y TRISA
El puerto PORTA es un puerto bidireccional, de 8 bits de anchura. Los bits del registro TRISA controlan los pines del puerto PORTA, o sea si se comportan como entradas o salidas digitales:
Similar a que los bits del registro TRISA determinan cuáles pines serán configurados como entradas y cuáles serán configurados como salidas, los bits apropiados del registro ANSEL determinan si los pines serán configurados como entradas analógicas o entradas/salidas digitales.
RA0 = AN0 (determinado por el bit ANS0 del registro ANSEL)
RA1 = AN1 (determinado por el bit ANS1 del registro ANSEL)
RA2 = AN2 (determinado por el bit ANS2 del registro ANSEL)
RA3 = AN3 (determinado por el bit ANS3 del registro ANSEL)
RA5 = AN4 (determinado por el bit ANS4 del registro ANSEL)
Cada bit de este puerto tiene una función adicional relacionada a algunas unidades periféricas integradas. Este capítulo cubre sólo la función adicional del pin RA0, puesto que está relacionado al puerto PORTA y a la unidad ULPWU. En los siguientes capítulos vamos a describir las funciones adicionales de los otros pines.
Vamos a hacerlo en mikroBasic...
' El pin PORTA.2 se configura como una entrada digital. Todos los demás pines del puerto PORTA
' son salidas digitales
...
ANSEL = ANSELH = 0 ' Todos los pines de E/S se configuran como digitales
PORTA = 0 ' Todos los pines del puerto PORTA se ponen a cero
TRISA = %00000100 ' Todos los pines del puerto PORTA excepto el
' PORTA.2 se configuran como salidas
...
UNIDAD ULPWU
El microcontrolador se utiliza generalmente en los dispositivos que funcionan periódicamente y completamente independiente utilizando una fuente de alimentación de batería. En tal caso, el consumo de corriente mínimo es una de las prioridades. Los ejemplos típicos de tales aplicaciones son: termómetros, sensores de detección del fuego y similar. Es conocido que al reducir frecuencia de reloj se reduce el consumo de corriente, pues una de las soluciones más convenientes a este problema es bajar la frecuencia de reloj, o sea utilizar el cristal de cuarzo de 32KHz en vez de el de 20MHz.
Al poner el microcontrolador en el modo de reposo es otro paso en la misma dirección. Aún ha quedado el problema de salir de este modo y poner el microcontrolador en modo normal de funcionamiento. Es obviamente necesario tener una señal externa en alguno de los pines. Esta señal
debe ser generada por componentes electrónicos adicionales, lo que resulta en un consumo de energía más alto del dispositivo completo...
La solución perfecta sería que el microcontrolador saliera del modo de reposo periódicamente por si mismo, lo que no es imposible. El circuito que lo habilita se muestra en la figura a la izquierda.
El principio de funcionamiento es simple:
Un pin se configura como salida y se le lleva un uno lógico (1). Esto causa una carga del capacitor. Inmediatamente después, el mismo pin se configura como entrada. El cambio de estado lógico habilita una interrupción y el microcontrolador entra en modo de reposo. Sólo ha quedado esperar que se descargue el capacitor por la corriente de fuga fluyendo por el pin de entrada. Después de la descarga, se produce una interrupción y el microcontrolador continúa con la ejecución de programa en modo normal. Todo el procedimiento se repite.
En teoría, esto es una solución perfecta. El problema es que todos los pines capaces de causar una interrupción son digitales y tienen una corriente de fuga relativamente alta cuando el voltaje sobre ellos no está cerca de los valores límites de Vdd (1) o VSS (0). En este caso, el condensador se descarga en poco tiempo ya que la corriente es de varias centenas de microamperios. Por esta razón se diseñó el circuito ULPWU, capaz de indicar una lenta caída de voltaje con un consumo de corriente mínimo. La salida genera una interrupción, mientras que la entrada está conectada al pin RA0 del microcontrolador. Refiriéndose a la Figura (R=200 ohms, C=1nF), el tiempo de descarga es aproximadamente 30mS, mientras que un consumo total de corriente del microcontrolador es 1000 veces más bajo (de varias centenas de nanoamperios).
Registros PORTB y TRISB
El puerto PORTB es un puerto bidireccional, de 8 bits de anchura. Los bits del registro TRISB determinan la función de sus pines.

Similar al puerto PORTA, un uno lógico (1) en el registro TRISB configura el pin apropiado en el puerto PORTB y al revés. Los seis pines de este puerto se pueden comportar como las entradas analógicas (AN). Los bits del registro ANSELH determinan si estos pines serán configurados como entradas analógicas o entradas/salidas digitales:
RB0 = AN12 (determinado por el bit ANS12 del registro ANSELH)
RB1 = AN10 (determinado por el bit ANS10 del registro ANSELH)
RB2 = AN8 (determinado por el bit ANS8 del registro ANSELH)
RB3 = AN9 (determinado por el bit ANS9 del registro ANSELH)
RB4 = AN11(determinado por el bit ANS11 del registro ANSELH)
RB5 = AN13 (determinado por el bit ANS13 del registro ANSELH)
Cada bit de este puerto tiene una función adicional relacionada a algunos módulos periféricos integrados, que vamos a describir en los siguientes capítulos.
Este puerto dispone de varias características por las que se distingue de otros puertos y por las que sus pines se utilizan con frecuencia:
- Todos los pines del puerto PORTB tienen las resistencias pull-up integradas, que los hacen perfectos para que se conecten con los botones de presión (con el teclado), interruptores u optoacopladores. Con el propósito de conectar las resisitencias a los puertos del microcontrolador, el bit apropiado del registro WPUB debe estar a uno.*
Al tener un alto nivel de resistencia (varias decenas de kiloohmios), estas resistencias “virtuales” no afectan a los pines configurados como salidas, sino que sirven de un complemento útil a los pines configurados como entradas. De lo contrario, se comportarían como si fueran flotantes gracias a su alta resistencia de entrada.
* Además de los bits del registro WPUB, hay otro bit que afecta a la instalación de las resistencias pull-up. Es el bit RBPU del registro OPTION_REG.
- El puerto PORTB se puede utilizar como una fuente de aliemntación. Al estar habilitado, cada bit del puerto PORTB configurado como una entrada puede causar una interrupción al cambiar su estado lógico. Con el propósito de habilitar que los pines causen una interrupción, el bit apropiado del registro IOCB debe estar a uno.
Gracias a estas características, los pines del puerto PORTB se utilizan con frecuencia para comprobar los botones de presión en el teclado ya que detectan cada apretón de botón infaliblemente. Por eso, no es necesario examinar todas las entradas una y otra vez.Cuando los pines X,Y y Z se configuran como entradas de puesta a uno (1), sólo se necesita esperar una petición de interrupción que aparece al apretar un botón. Más tarde, se comprueba cuál botón fue activado al combinar ceros y unos en las entradas.
Vamos a hacerlo en mikroBasic...
'El pin PORTB.1 se configura como entrada digital. Se produce una interrupción con cualquier
'cambio de su estado lógico. También tiene una resistencia pull-up. Todos los demás pines del
'puerto PORTB son salidas digitales.
...
ANSEL, ANSELH = 0 ' Todos los pines de E/S se configuran como digitales
PORTB = 0 ' Todos los pines del puerto PORTB se ponen a cero
TRISB = %00000010 ' Todos los pines del puerto PORTB excepto PORTB.1
' se configuran como salidas
OPTION_REG.RBPU = 0 ' Se habilitan las resistencias pull-up
WPUB.1 = 1 ' La resistencia pull-up se conecta al pin PORTB.1
IOCB.1 = 1 ' El pin PORTB.1 puede causar una interrupción por el
' cambio del estado lógico
INTCON.RBIE = 1 ' Se habilita una interrupción por el cambio del estado
' lógico en el puerto
INTCON.GIE = 1 ' Se habilitan todas las interrupciones no enmascaradas
...
PIN RB0/INT
El pin RB0/INT es la única fuente “verdadera” de la interrupción externa. Se puede confi-gurar de manera que responda al borde ascendente de señal (transición de cero a uno) o al borde descendente de señal (transición de uno a cero). El bit INTEDG del registro OPTION_REG selecciona la señal apropriada.
Pines RB6 y RB7
El PIC16F887 no dispone de ningún pin especial para la programación. Esta función se les asigna a los pines de E/S. Más concretamente son los pines del puerto PORTB utilizados para la transmisión de señal de reloj (RB6) y de datos (RB7) durante la programación. Además, es necesario suministrar el voltaje de alimentación Vdd (5V) así como el voltaje apropiado Vpp (12-14V) para la programación de memoria FLASH. El pin MCLR se utiliza para este propósito. No se preocupe de los detalles relacionados a este proceso, tampoco se preocupe de cuál voltaje se aplica primero puesto que el programador se encargan de eso. Se habilita cargar el programa en el microcontrolador aún después de haber sido soldado en el dispositivo destino. Por supuesto, el programa cargado se puede cambiar de la misma manera. Esta función se le denomina ICSP (In-Circuit Serial Programming - Programación serial en circuito). Para utilizarlo correctamente es necesario planificar con antelación.
Sólo es necesario instalar un conector miniatura de 5 pines en el dispositivo destino para suministrar al microcontrolador un voltaje de programación necesario. Para evitar la interferencia entre los voltajes y el funcionamiento de los otros módulos conectados a los pines del microcontrolador, es necesario aislarlos de la placa durante la programación utilizando las resistencias o los puentes.


Como hemos visto, los voltajes aplicados a los pines del zócalo del programador son los mismos que los utilizados durante la programación ICSP.
Registros PORTC y TRISC
El puerto PORTC es un puerto bidireccional, de 8 bits de anchura. Los bits del registro TRISC determinan la función de sus pines. Similar a otros puertos, un uno lógico (1) en el registro TRISC configura el pin apropiado del puerto PORTC como entrada.
Todas las funciones adicionales del puerto PORTC se describen en los siguientes capítulos.
Registros PORTD y TRISD
El puerto PORTD es un puerto bidireccional de 8 bits de anchura. Los bits del registro TRISD determinan la función de sus pines. Similar a otros puertos, un uno lógico (1) en el registro TRISD configura el pin apropiado del puerto PORTD como entrada
Registros PORTE y TRISE
El puerto PORTE es un puerto bidireccional, de 4 bits de anchura.
Los bits del registro TRISE determinan la función de sus pines. Similar a otros puertos, un uno lógico (1) en el registro TRISE configura el pin apropiado del puerto PORTE como entrada.
La excepción es el pin RE3, que siempre está configurado como entrada.
Similar a los puertos PORTA y PORTB, en este caso los tres pines se pueden configurar como entradas analógicas. Los bits del registro ANSEL determinan si estos pines serán configurados como entradas analógicas (AN) o entradas/salidas digitales:
RE0 = AN5 (determinado por el bit ANS5 del registro ANSEL);
RE1 = AN6 (determinado por el bit ANS6 del registro ANSEL); y
RE2 = AN7 (determinado por el bit ANS7 del registro ANSEL).
Vamos a hacerlo en mikroBasic...
' El pin PORTE.0 se configura como una entrada analógica mientras que los demás tres pines
' del mismo puerto se configuran como digitales
ANSEL = %00100000 ' El pin PORTE.0 se configura como analógico
ANSELH = 0 ' Todos los pines de E/S se configuran como digitales
TRISE = %00000001 ' Todos los pines del puerto PORTE excepto el
' PORTE.0 se configuran como salidas
PORTE = 0 ' Todos los bits del puerto PORTE se ponen a cero
...
Registros ANSEL y ANSELH
Los registros ANSEL y ANSELH se utilizan para configurar el modo de entrada de un pin de E/S como analógico o como digital.
La regla es la siguiente:
Para configurar un pin como una entrada analógica, el bit apropiado de los registros ANSEL o ANSELH se debe poner a uno (1). Para configurar un pin como una entrada/salida digital, el bit apropiado se debe poner a cero (0).
El estado lógico de los bits del registro ANSEL no tiene influencia en las funciones de salidas digitales. Al intentar a leer un pin de puerto configurado como una entrada analógica, el resultado es siempre 0.
En breve
Es probable que usted nunca vaya a escribir un programa que no utilice puertos, así que el esfuerzo para aprender todo sobre ellos en definitiva vale la pena. De todos modos, los puertos son probablemente los módulos más simples dentro del microcontrolador. Se utilizan de la siguiente manera:
- Al diseñar un dispositivo, seleccione un puerto por el que el microcontrolador comunicará al entorno periférico. Si usted utiliza sólo entradas/salidas digitales, seleccione cualquier puerto. Si utiliza alguna de las entradas analógicas, seleccione los puertos apropiados que soportan al configuración de los pines (AN0-AN13).
- Cada pin del puerto se puede configurar como salida o como entrada. Los bits de los registros TRISA,TRISB, TRISC, TRISD y TRISE determinan cómo se comportarán los pines apropiados de los puertos PORTA, PORTB, PORTC, PORTD y PORTE. Simplemente...
- Si utiliza alguna de las entradas analógicas, primero es necesario poner a uno los bits apropiados de los registros ANSEL y ANSELH en el principio de programa.
- Si utiliza resistencias o botones de presión como una fuente de señal de entrada, conéctelos a los pines del puerto PORTB, ya que tienen las resistencias pull-up. El uso de estos registros está habilitado por el bit RBPU del registro OPTION_REG, mientras que la instalación de las resistencias individuales está habilitada por los bits del registro WPUB.
- Con frecuencia se necesita responder tan pronto como los pines de entrada cambien su estado lógico. Sin embargo, no es necesario escribir un programa para comprobar el estado lógico de los pines. Es mucho más simple conectar estas entradas a los pines del puerto PORTB y habilitar que ocurra una interrupción con cada cambio de voltaje. Los bits de los registros IOCB e INTCON se encargan de eso.