Puertos, entradas y salidas del microcontrolador

Todos los microcontroladores tienen pines que pueden ser usados para recibir (entrada) o entregar (salida) información en forma de voltaje. Estos pines ayudan en primera medida al microcontrolador a “comunicarse” o controlar el estado de los sensores o actuadores conectados a él.

Dependiendo del microcontrolador, este puede tener uno o varios puertos, en nuestro caso usamos el PIC16F1827 que tiene dos, identificados como PORTA y PORTB, cada uno con ocho pines desde RA0 hasta RA7 y RB0 hasta RB7 respectivamente.

Como se ve el anterior esquema cada pin tiene una flecha que apunta en ambas direcciones en su mayoría, eso indica que esos pines pueden ser usados como entrada o como salida, solo hay uno (el pin 4, RA5), que únicamente puede ser usado como entrada, no como salida.

Para configurar el microcontrolador de modo que él sepa que pines serán de entrada o salida usaremos uno registros de este llamados TRIS, hay uno por cada puerto, es decir TRISA para el puerto A y TRISB para el puerto B.

En este microcontrolador cada registro tiene un tamaño de ocho bits, es decir que TRISA y TRISB tienen un bit donde se configura el pin correspondiente al puerto para decirle que es una entrada o una salida, en la siguiente tabla se muestra como cada bit de TRISA corresponde a un bit en PORTA:

TRISA PORTA
TRISA7 RA7
TRISA6 RA6
TRISA5 RA5
TRISA4 RA4
TRISA3 RA3
TRISA2 RA2
TRISA1 RA1
TRISA0 RA0

Cada cajón de TRISA representa a un bit del registro, dependiendo de qué valor le demos a ese bit (0 o 1), incidirá en el bit correspondiente en el puerto A, si ponemos un 0 esto hará que se convierta en salida, si ponemos un 1 hará que se convierta en entrada.

Por ejemplo, veamos de nuevo tabla donde asignamos valores a cada bit de TRISA y de qué modo se refleja en PORTA.

TRISA Valor PORTA Estado
TRISA7 0 RA7 Salida
TRISA6 1 RA6 Entrada
TRISA5 1 RA5 Entrada
TRISA4 0 RA4 Salida
TRISA3 1 RA3 Entrada
TRISA2 1 RA2 Entrada
TRISA1 0 RA1 Salida
TRISA0 0 RA0 Salida

De esta forma, configurando el registro TRISA hemos hecho entradas y salidas en el puerto A, del mismo modo lo podemos hacer para los demás puertos configurando el TRIS correspondiente.

Hemos dicho que hay que poner unos o ceros en cada registro TRIS para configurar entradas o salidas, ¿pero cómo se hace? La respuesta es muy sencilla y ya pronto lo veremos en un ejemplo en nuestro primer programa, solo escribiendo la siguiente línea de código estaremos obteniendo el resultado que se mostró en la tabla anterior.

TRISA = 0b01101100;

De este modo se le ha asignado el valor correspondiente en binario al registro TRISA para que el puerto tenga entradas y salidas como se mostró en la tabla. Ahora no necesariamente debemos usar código binario para asignar estos valores, también podemos usar números en decimal o hexadecimal así:

TRISA = 0x6C;     // Hexadecimal

TRISA = 108;       // Decimal

Nótese como están escritos, cuando lo hacemos en binario debemos anteponer 0b seguido del número, para hexadecimal anteponemos 0x seguido del valor y en decimal solo ponemos el número, debemos recordar al final de cada línea de código poner punto y coma (;).

Si te has fijado bien, al final de cada instrucción pusimos un par de barras inclinadas //,  se usan para escribir comentarios, estos son de gran utilidad para nosotros u otras personas que lean nuestro código, ayudan a entender que sucede en ese punto, puede que al principio creamos que nos acordamos de todo, pero confía en nosotros, no están de más y son una muy buena práctica en programación.

Ya configuramos el puerto, ahora ¿cómo lo usamos? Cuando establecemos una entrada lo que hacemos es leer que nivel de voltaje hay en ella, generalmente se lee un estado lógico 1 (5 voltios) o un 0 (0 voltios) y cuando se establece como salida podemos escribir el estado lógico que queremos que aparezca en ella.

Por ejemplo, digamos que los primeros cuatro pines del puerto B van a ser salidas y las cuatro restantes entradas, la línea que configura el TRISB se vería así:

TRISB = 0b11110000;      // Tenemos RB0, RB1, RB2 y RB3 salidas y RB4, RB5, RB6 y RB7 entradas

Ahora queremos que por RB0 y RB2 salgan 5 voltios (estado lógico 1) y por RB1 y RB3 salgan 0 voltios (estado lógico 0).

Usaremos el registro correspondiente al puerto, PORT, acompañado de la letra correspondiente, para este caso, PORTB, y lo escribimos así:

PORTB = 0b0000010’;

Como ves los bits correspondientes a las entradas fueron escritos con cero, no hay de qué preocuparse porque esto no afecta el valor de la entrada.

Con esta información podemos empezar a hacer nuestro primer programa, vamos a hacer que un Led encienda y apague cada medio segundo.