Tabla de contenido
En esta clase, exploraremos cómo utilizar un custom port en el microcontrolador ATmega328P utilizando el lenguaje de programación C. Un custom port es una técnica que nos permite expandir la funcionalidad de los puertos de entrada/salida (I/O) cuando un puerto de 8 bits no es suficiente para manejar todas las entradas y salidas requeridas en un proyecto. Esto es especialmente útil en aplicaciones donde se necesita controlar un gran número de dispositivos o sensores.
Un custom port es una abstracción que nos permite manejar un conjunto de pines de diferentes puertos como si fueran un solo puerto virtual. Esto es particularmente útil cuando necesitamos más de 8 bits para controlar entradas y salidas, ya que el ATmega328P tiene puertos de 8 bits (PORTB, PORTC, PORTD, etc.). Al combinar pines de diferentes puertos, podemos crear un puerto virtual de mayor tamaño.
Supongamos que necesitamos controlar 10 LEDs, pero solo disponemos de puertos de 8 bits. Podemos combinar pines de dos puertos diferentes para crear un custom port de 12 bits. Por ejemplo, podríamos usar 8 pines de PORTB y 4 pines de PORTC para crear un puerto virtual de 12 bits.

#define CUSTOM_PORT_LOW PORTC //Los 6 bits bajos del custom port
#define CUSTOM_PORT_HIGH PORTB // Los 4 bits altos del custom port
void set_custom_port(uint16_t value)
{ //76543210
CUSTOM_PORT_LOW = (value & 0b00111111) | (CUSTOM_PORT_LOW & 0b11000000); // Establece los 6 bits bajos
CUSTOM_PORT_HIGH = ((value >> 5) & 0b00001111) | (CUSTOM_PORT_HIGH & 0b11110000)) ; // Establece los 4 bits altos
}
En este ejemplo, la función set_custom_port toma un valor de 11 bits y lo divide en dos partes: los 4 bits altos se asignan a PORTB y los 6 bits bajos se asignan a PORTC.
El código presente utiliza un switch case para determinar la acción a realizar según el estado de dos entradas. Esto se logra leyendo el estado de los pines de entrada y utilizando operaciones bitwise para concatenar los valores de los bits correspondientes a Input_1 e Input_0.
La concatenación de bits se realiza utilizando operaciones bitwise. Por ejemplo:
0bXXXXXXXX & 0b00000001 = 0b000000X: Se obtiene el estado del bit 0.0bXXXXXXXX & 0b0000010 = 0b00000X0: Se obtiene el estado del bit 1.