Manejo de puertos digitales - Hotboards/CodeBank8 GitHub Wiki
Cada microcontrolador no importando su arquitectura interna o su fabricante, posee puertos de entrada y salida de propósito general (I/O Ports). Estos periféricos son los mas sencillos de usar y representan el primer contacto de nuestro programa con estímulos del mundo real.
Usualmente los fabricantes suelen representar a los puertos con las primeras letras del abecedario o con numero (iniciando de 0). Microchip por ejemplo usa PORTA
, PORTB
, etc. Mientras que NXP los llama PORT0
, PORT1
, etc.
Los puertos digitales o I/O ports pueden funcionar como puertos de entrada o puertos de salida, lo mas común es que se configure este comportamiento mediante un registro especial. Una vez configurado su comportamiento se deberá escribir los datos de salida en otro registro especial (si se configura como salida) y a su vez si quisiéramos leer datos del puerto deberás leerlos en otro registro especial (si se configuro como entrada).
En el caso del fabricante microchip (en lo particular sus micros de 8 bits) poseen los siguientes registros para controlar los I/O ports. Donde la (x) representa la letra que identifica el puerto (PORTA, PORTB, etc)
- TRISx.- Registro para configurar el puerto como entrada o salida
- PORTx.- Registro para leer los datos (si se configuro como entrada)
- LATx.- Registro para escribir datos (si se configuro como salida)
En el caso de los micros de 8 bits del fabricante Microchip estos tres registros tienen un tamaño de 8 bits, donde cada bit representa un pin del puerto (un total de 8 pines por puerto)
En este ejemplo vamos a configurar todo el puerto B como salida y escribiremos en el un dato. Para configurar como salida los puertos en un micro de Microchip se debe escribir un 0 por cada pin que se dese que actue como salida. En caso de requerirse su funcionamiento como entrada se debe escribir un 1 (en cada bit)
TRISB = 0x00; // Todo el puerto B como salida (ceros en todos los bits)
LATB = 0x55; // Escribimos 10101010 en el puerto B
Aparte de operar cada uno de los puertos de manera completa (sus 8 pines por vez), también se puede trabajar con cada pin por separado. Para esto se realizan operaciones de enmascaramiento y corrimientos.
TRISB &= ~(1<<3); // pin 3 del puerto B como salida (se coloca el bit 3 en cero)
LATB |= (1<<3); // pin 3 del puerto B en ‘1’
LATB &= ~(1<<3); // pin 3 del puerto B en ‘0’
Recuerdas que estas mismas operaciones las realizamos con variables, esto es porque los registros del microcontrolador en el lenguaje C
se manejan como si fueran variables. Así que las mismas operaciones que se realizan con las variables se pueden realizar con los registros.
De requerirse se pueden combinar los pines de un puerto algunos como entradas y otros como salidas. Para interactuar con ellos es necesario enmascarar el grupo de pines.
char var;
TRISB = 0x0F; // pines 0-3 como salida y pines 4-7 como entrada
var=(PORTB & 0xf0)>>4; // leemos solo la parte alta (pines 4-7)
LATB = var; // escribimos lo leído en la parte baja (pines 0-3)
En este ejemplo los 4 primeros pines se escribían sin modificar el valor de los últimos 4 pines configurados como entradas.
Anteriormente aprendimos como usar los I/O ports escribiendo directamente en los registros del micro (Microchip), esta es la forma en la que todos los micros de cualquier fabricante manipula los puertos digitales.
En el banco de código podrás encontrar un drive especifico que aleja la anterior complejidad y permite manejar mediante funciones predefinidas el uso de estos puertos. Date una vuelta por la pagina de los gpios, donde ademas encontraras ejemplos de uso listos para correr en la tarjeta pepper-8m.