Cómo diseñar una biblioteca Arduino para un puerto IO de 8 bits

En este proyecto, crearemos una biblioteca Arduino de puerto IO de 8 bits que lee y escribe los ocho bits en un solo comando combinando pines Arduino. Esto significa que será posible enviar y recibir datos de 8 bits desde un solo pin.

Arduino proporciona salida digital utilizando la función digitalWrite y recibe entrada digital a través de la función digitalRead. Al utilizar estas dos funciones, Arduino puede proporcionar salida o entrada desde cualquier pin. Sin embargo, Arduino normalmente sólo proporciona entrada o salida a un pin a la vez.

Por lo tanto, para conectar Arduino con un dispositivo IO de 8 bits, como una pantalla de 7 segmentos, interruptores DIP o DAC (convertidor digital a analógico), generalmente se requieren ocho pines diferentes. El patrón de bytes de datos (8 bits) se envía a diferentes pines como '1' y '0'. Por ejemplo, si un byte de datos es 37h (0011 0111), necesita enviar el patrón '0' y '1' a ocho pines diferentes usando la función digitalWrite.

Para resolver esta situación, creamos una biblioteca de puerto IO (puerto de entrada-salida) de 8 bits que combina los pines de Arduino. Funciona como un puerto IO de 8 bits para Arduino y configura la dirección de los datos como entrada o salida. La dirección de los datos está definida por el carácter 'O' para salida y 'I' para entrada.

Esta biblioteca tiene cinco funciones. Dos "constructores" crean los objetos de la puerta, incluida una función que envía una salida digital de 8 bits a los pines de la puerta y otra que recibe una entrada digital de 8 bits desde los pines de la puerta. Una tercera función cambia y establece la dirección de E/S del puerto. Las cinco funciones se explican a continuación.

Las cinco funciones

1. IO_Port_8bit(int pin1,int pin2,int pin3,int pin4,int pin5,int pin6,int pin7,int pin8,directorio char)
Este constructor crea objetos de esta clase. Puede crear uno o varios puertos de 8 bits combinando pines Arduino específicos. Es importante especificar qué ocho pines Arduino deben coincidir, junto con la dirección de datos de cada puerto (entrada o salida). El último argumento, dir, define si un puerto funciona como entrada o salida.

  • Si dir='O' = el puerto funciona como salida
  • Si dir='I' = el puerto actúa como entrada

Un mismo puerto no puede funcionar como entrada y salida de forma simultánea o alternativa. Se debe seleccionar la dirección del puerto o se producirá un error.

2. IO_Port_8bit (int pin1, int pin2, int pin3, int pin4, int pin5, int pin6, int pin7, int pin8)
Este es otro constructor, que crea objetos de esta clase. Puede crear uno o varios puertos de 8 bits combinando pines Arduino específicos. Es importante especificar qué ocho pines Arduino deben coincidir con cada puerto. Sin embargo, no es necesario incluir la dirección de los datos como entrada o salida.

En su lugar, después de crear un objeto de puerto usando este constructor, establezca la dirección del puerto usando la función set_IO_direction. Este constructor permite al programador cambiar la dirección de los datos del puerto en tiempo de ejecución. Así, un puerto puede funcionar como entrada o salida alternativamente (pero no simultáneamente).

3. set_IO_direction (directorio de caracteres)
Esta función especifica la dirección de entrada y salida de un puerto. Tiene un argumento de carácter, que es 'I' para un puerto de entrada y 'O' para un puerto de salida. Se mostrará un error en el monitor serie Arduino si no se selecciona la dirección de los datos.

4. send_8_bit_data(int byt)
Esta función envía datos de 8 bits a pines específicos. Proporciona los datos 'int' (debe ser <255) como argumento, que se envía directamente a ocho pines diferentes. Si los datos son >255, se mostrará un error en el monitor serie Arduino.

5. get_8bit_data (vacío)
Esta función recibe datos de 8 bits de pines específicos. Devuelve datos 'int' de 8 bits leyendo el estado de los ocho pines diferentes.

Ejemplo 1: ocho LED parpadean alternativamente a una velocidad de 1 Hz

#incluir

IO_Port_8bit mipuerto(2,3,4,5,6,7,8,9,'O'); //crea puerto de salida
configuración vacía // no se requiere nada en la configuración
{
}
bucle vacío
{
myport.send_8bit_data(85); // envía datos para hacer parpadear todos los LED impares
retraso(500);
myport.send_8bit_data(170); envía datos para hacer parpadear todos los LED pares
retraso(500);
}

Diagrama de circuito

Ejemplo 2: mostrar un patrón de conteo binario en los LED, de 0 a F

#incluir
IO_Port_8bit my8bitport(2,3,4,5,6,7,8,9);//crear objeto de puerto
configuración nula
{
my8bitport.set_IO_direction('O');// establece la dirección del puerto
}

bucle vacío
{
ent yo;
for(i=0;i<16;i++) //envía datos del 0 al 15 para su visualización
{ // patrón binario
mipuerto.send_8bit_data(i);
retraso(200);
}
}

Ejemplo 3: indicar el nivel de voltaje de entrada analógica en una pantalla gráfica de barras LED de 8 bits

#incluir

IO_Port_8bit mipuerto(2,3,4,5,6,7,8,9,'O'); //crea un objeto de puerto de salida
configuración nula
{
myport.send_8bit_data(255); //hace parpadear todos los LED del gráfico de barras una vez
retraso(500);
mipuerto.send_8bit_data(0);
}

bucle vacío
{
nivel internacional;
nivel = lectura analógica (A0); //leer el voltaje de entrada analógica
nivel = mapa(nivel,0.1023,0.80);// limita el voltaje de 0 a 80
//aumentar o disminuir el nivel del gráfico de barras dependiendo de la entrada
if((nivel<80) && (nivel>70)) myport.send_8bit_data(255);
else if((nivel<=70) && (nivel>60)) myport.send_8bit_data(127);
else if((nivel<=60) && (nivel>50)) myport.send_8bit_data(63);
else if((nivel<=50) && (nivel>40)) myport.send_8bit_data(31);
else if((nivel<=40) && (nivel>30)) myport.send_8bit_data(15);
else if((nivel<=30) && (nivel>20)) myport.send_8bit_data(7);
else if((nivel<=20) && (nivel>10))myport.send_8bit_data(3);
else if((nivel<=10) && (nivel>0)) myport.send_8bit_data(1);
else if(nivel==0) myport.send_8bit_data(0);

}

Diagrama de circuito

Ejemplo 4: recibir entrada digital de 8 bits desde interruptores DIP y mostrar el valor en el monitor serie

#incluir

IO_Port_8bit mipuerto(2,3,4,5,6,7,8,9); //crea objeto de puerta
configuración nula
{
Serie.begin(9600); // inicializa la comunicación serie.
myport.set_IO_direction('Yo'); // define la dirección del puerto
Serial.println(“prueba del puerto de entrada de 8 bits”);
}

bucle vacío
{
int entrada_byte;
input_byt = mipuerto.get_8bit_data; // leer el estado del interruptor DIP
Serial.print(“entrada recibida = “); // Es
Serial.println(input_byt); //muestra su valor
retraso(1000);
}

Diagrama de circuito

contenido relacionado

Regresar al blog

Deja un comentario

Ten en cuenta que los comentarios deben aprobarse antes de que se publiquen.