Si desea utilizar una transferencia de datos de software, no desea utilizar las funciones digitalWrite. Son muy lentos, esto se debe a que necesitan traducir el número de pin a través de una tabla a un registro real (PORTx), enmascarar el bit correcto y cambiarlo. Todos los pines en arduino están asignados a números, mientras que debajo pueden pertenecer al puerto A, B, C, e incluso más en la versión MEGA del Arduino.
Es mucho más rápido modificar directamente los registros AVR. Como PORTB y a-like. De hecho necesitas pasar por cada bit. Me gustaría crear un bucle for de 0 a 15 y hacer un poco de cambio y enmascaramiento.
Como no sé, no puedo dar un ejemplo exacto. Sin embargo, probablemente se verá muy cerca de esto. Con 'muy cerca' quiero decir que esto no está probado.
%pr_e%
// paso del bit 0 al 15
para (UI08_t i = 0; i < 15; i ++)
{
// Verificar el contenido de este bit de datos.
// Desplazar datos para que este bit sea LSB, y enmascararlo con 1 para que solo veamos este bit.
if ((datos > > i) & 0x1 == 1)
{
// establecer el pin de datos alto, como PORTB | = 1 < < 4;
// cuando el pin 4 de portB es tu pin de datos
// Hacer un OR hará que el pin B4 siempre sea alto
}
más
{
// establece el pin de datos bajo, como PORTB & = ~ (1 < < 4);
// Hacer un AND con el inverso significa que todos los pines, excepto B4, se mantendrán sin cambios
}
// Generar clk para 'transferir' el bit:
// Es probable que esto se pueda hacer usando PORTB ^ = 1 < < 5; (pin B5 en este ejemplo)
// ^ = alternar
// Haz esto DOS VECES, entonces CLK va alto / bajo
}
// como está utilizando un registro de desplazamiento, es posible que también desee alternar el pin LATCH ..
}
Para averiguar qué número de pin de hardware (¡no asumas que el pin 4 es el pin B4 o A4!) Necesitas mirar el esquema de Arduino.
He ejecutado un código similar en un PIC32 (funciona a 80MHz). El PIC32 pudo hacer esto a aproximadamente 1,5 MHz, pero se ejecutaron algunas líneas de código adicionales en main () para calcular una nueva salida. Sin embargo, se puede hacer muy rápidamente.