3.3 Puertos de Entrada/Salida
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 re aliza 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 (pin=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 = Entrada 1 = Salida.
Puerto PORTA y registro TRISA
El puerto PORTA es un puerto bidireccional, de 8 bits de anchura. Los bits de los registros TRISA y ANSEL controlan los pines del PORTA. Todos los pines del PORTA se comportan como entradas/salidas digitales. Cinco de ellos pueden ser entradas analógicas (denotadas por AN):
![al-mundo-de-los-microcontroladores-chapter-03-fig3-36](https://cdn.mikroe.com/ebooks/img/37/2016/02/al-mundo-de-los-microcontroladores-chapter-03-fig3-36.gif)
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)
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.
Cada bit de este puerto tiene una función adicional relacionada a algunas unidades periféricas integradas, que vamos a describir en los siguientes capítulos. 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.
Vamos a hacerlo en mikroC...
// 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 = 0b00000100; // 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.
La salida genera una interrupción, mientras que la entrada está conectada a uno de los pines del microcontrolador. Es el pin RA0. 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).
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.
Puerto PORTB y registro 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.
![al-mundo-de-los-microcontroladores-chapter-03-fig3-39](https://cdn.mikroe.com/ebooks/img/37/2016/02/al-mundo-de-los-microcontroladores-chapter-03-fig3-39.gif)
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 ANS11del registro ANSELH)
RB4 = AN11 (determinado por el bit ANS11del registro ANSELH)
Cada bit de este puerto tiene una función adicional relacionada a algunas unidades periféricas integradas, 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 y 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 las entradas. Estas resistencias están conectados a las entradas de los circuitos lógicos CMOS. 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.
- 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 termi nales 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 mikroC...
/* 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 entradas 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 = 0b00000010; // Todos los pines del puerto PORTB excepto PORTB.1
// se configuran como salidas
RBPU = 0; // Se habilitan las resistencias pull-up
WPUB1 = 1; // La resistencia pull-up se conecta al pin PORTB.1
IOCB1 = 1; // El pin PORTB.1 puede causar una interrupción por el
// cambio del estado lógico
RBIE = GIE = 1; // Se habilita una interrupción
...
PIN RB0/INT
El pin RB0/INT es la única fuente “verdadera” de la interrupción externa. Se puede configurar de manera que reaccione 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 (el proceso de escribir un programa en la ROM). Los pines que generalmente están disponibles como los pines de E/S de propósito general, se utilizan para este propósito. Para decir con más precisión, son los pines del puerto PORTB utilizados para la transmisión de señal de reloj (RB6) y de datos (RB7) al cargar el programa. 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. Durante la programación, el voltaje Vpp se aplica al pin MCLR. No se preocupe de los detalles relacionados a este proceso, tampoco se preocupe de cuál voltaje se aplica primero puesto que los componentes del programador se encargan de eso. Lo que es muy importante es que el programa se puede cargar al 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. ¡Es pan comido! 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 los componentes del dispositivo conectados a los pines del microcontrolador, todos los periféricos adicionales deben estar desconectados durante la programación (utilizando las resistencias o los puentes).
![al-mundo-de-los-microcontroladores-chapter-03-fig3-44](https://cdn.mikroe.com/ebooks/img/37/2016/02/al-mundo-de-los-microcontroladores-chapter-03-fig3-44.gif)
![al-mundo-de-los-microcontroladores-chapter-03-fig3-45](https://cdn.mikroe.com/ebooks/img/37/2016/02/al-mundo-de-los-microcontroladores-chapter-03-fig3-45.gif)
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.
Puerto PORTC y registro 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.
Puerto PORTD y registro 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.
Puerto PORTE y registro 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 mikroC...
/* 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 = 0b00100000; // El pin PORTE.0 se configura como analógico
ANSELH = 0; // Todos los pines de E/S se configuran como digitales
TRISE = 0b00000001; // 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.
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 tal 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 com portará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 en trada, 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.
El microcontrolador PIC16F887 dispone de tres temporizadores/contadores independientes, denominados Timer0, Timer1 y Timer2. En este capítulo se presenta una descripción detallada de los mismos.