Hola a todos!
El otoño pasado me hice un pequeño POV o giroplay de mano. Este tiene 24 LEDs en una columna que decidí conectarlos todos al micro sin tener en cuenta el puerto o el bit que debían ocupar, simplemente quería que la placa fuera lo más sencilla posible sabiendo que luego podía reordenar los bits por sofware.
Ahora me encuentro con el problema de que mover cada bit que quiero pintar a su LED correspondiente requiere más tiempo del que esperaba. Me gustaría optimizar una función y ya no se me ocurre que más hacer.
A la función se le pasa un dato tipo unsigned long long y esta se encarga de reordenar los 24 primeros bits del dato. El caso es que es esta función se utiliza muchas veces en el programa y me gustaria optimizarla para mejorar el rendimiento total.
const unsigned long long LEDSNETLIST[24] = // 0x1ULL << bitnumber+port*16
{
0x1ULL << (10+16), 0x1ULL << (9+32), 0x1ULL << (8+32), 0x1ULL << (7+32),
0x1ULL << (6+32), 0x1ULL << (9+16), 0x1ULL << (8+16), 0x1ULL << (7+16),
0x1ULL << (6+16), 0x1ULL << (5+16), 0x1ULL << (15+16), 0x1ULL << (5+32),
0x1ULL << (4+32), 0x1ULL << (3+32), 0x1ULL << (9+0), 0x1ULL << (8+0),
0x1ULL << (3+0), 0x1ULL << (2+0), 0x1ULL << (2+32), 0x1ULL << (1+32),
0x1ULL << (0+0), 0x1ULL << (0+32), 0x1ULL << (3+16), 0x1ULL << (2+16)
};
unsigned long long order_LEDS( unsigned long value )
{
unsigned long long out = 0;
unsigned char i = 0;
if( value ) // If value == 0, skip loop.
for( i = 0 ; i < 24 ; i++, value >>= 1 )
if( value & 0x1 )
out |= LEDSNETLIST[i];
return out;
}
La función es muy sencilla, basicamente comprueba cada uno de los 24 primeros bits de el dato de entrada, y si es 1 se pone a 1 el bit correspondiente de la salida.
Otra opción más fea es con 24 sentencias tipo if( in & 0x1 ) out |= 0x1; o tambien BTFSC in,X BSF out,Y.
Algunos bits creo se podrían mover por bloques(out |= (in&MASKX)>>ROTX;), ya que hay muchos que son contiguos, pero el bloque mas largo es de 5 bits y creo tampoco seria más eficiente...
Lo que me interesa primero es que la función sea rapida, pero tambien me interesa que el código sea sencillo y que si se cambia el orden de los bits no sea muy engorroso modificar la función.
Saludos