1 << 2 -> 0b0100
0b1000 xor 0b0100 = 0b1100
1 << 3 -> 0b1000
0b1100 xor 0b1000 = 0b0100
1 << 1 -> 0b0010
0b0100 xor 0b0010 = 0b0110
1 << 2 -> 0b0100
0b0110 xor 0b0100 = 0b0010
1 << 0 -> 0b0001
0b0010 xor 0b0001 = 0b0011
1 << 1 -> 0b0010
0b0011 xor 0b0001 = 0b0001
1 << 3 -> 0b1000
0b0001 xor 0b1000 = 0b1001
1 << 0 -> 0b0001
0b1001 xor 0b0001 = 0b1000
1 << 2 -> 0b0100
0b1000 xor 0b0100 = 0b1100
Bueno, aunque esto no es un estire y afloja, también se puede observar la estructura del problema para obtener optimizaciones que son triviales.
Por ejemplo, lo primero que se puede observar es que entre pasos existe un sólo cambio, al puro estilo del código grey, eso se puede aprovechar, ya que lo único que debes de hacer es estar atento cual es el bit que cambia.
0b1000, 0b1100, 0b0100, 0b0110, 0b0010, 0b0011, 0b0001, 0b1001
Considerando que tu estado inicial es 0b1000, el contenido del arreglo podría quedar asíCódigo: C
const uint8_t medio_paso[] = {2,3,1,2,0,1,3,0};
y luego, en el lugar que decidas que debe ir, ya sea usando un delay o un timer, colocasCódigo: C
LATB^= 1 << medio_paso[i];
Estado Inicial
0b1000Código: [Seleccionar]1 << 2 -> 0b0100
0b1000 xor 0b0100 = 0b1100
1 << 3 -> 0b1000
0b1100 xor 0b1000 = 0b0100
1 << 1 -> 0b0010
0b0100 xor 0b0010 = 0b0110
1 << 2 -> 0b0100
0b0110 xor 0b0100 = 0b0010
1 << 0 -> 0b0001
0b0010 xor 0b0001 = 0b0011
1 << 1 -> 0b0010
0b0011 xor 0b0001 = 0b0001
1 << 3 -> 0b1000
0b0001 xor 0b1000 = 0b1001
1 << 0 -> 0b0001
0b1001 xor 0b0001 = 0b1000
1 << 2 -> 0b0100
0b1000 xor 0b0100 = 0b1100
En ASM esto puede representar tan sólo un bit set o un bit reset, que de todas formas también vienen en la siguiente secuencia:
{1,0,1,0,1,0...}
Donde 1 es un bit set y 0 es un bit reset.
1
0 p 2
3
0
1
2
3
1
2
3
4
2
3
4
5
...
+1 0 -1
+2 0 -2
+1 0 -1
+1 +2 +1
0 0 0
-1 -2 -1
+4
+4 p +4
+4
Lo que se ve a simple vista es que te convierte de un conjunto de puntos a una paleta de 16 colores.
Con el AND lo que haces conocer si el punto está prendido o apagado, en cada vuelta puedes procesar una región o ventana conformada por una matriz de 4x16 puntos.
Así que, aunque los operadores bitwise sean interesantes, es más interesante el algoritmo que hay detrás del trabajo de procesamiento de imágenes.
A menos que que cada punto físico original esté conformado por 4 puntos más pequeños, si lo vemos como un filtro, aparte de convertir de unos puntos cualquiera a una paleta de colores, al realizar una combinación de los puntos que son adyacentes al punto que quieres convertir a pixel, generas mejores los contornos y suavizas la imagen resultante. Pero los puntos adyacentes pueden ser cualquiera. Por ejemplo, estos podrían ser los cuatro puntos que se encuentran alrededor del punto a convertir, y es lo más común.
Lo que no cazo es lo de la máscara a 0x8000, y porque el bucle while está rodando hasta que la máscara dotMask deja de ser cierta. Supongo que el while se ejecuta mientras dosMask no sea cero.
La máscara empieza en 0x8000, y por cada pase por el bucle del while, le hace un desplazamiento de un bit a la derecha, no entiendo para que sirve esto.
Luego no hay incremento de movimiento, es decir falta un movimiento++, y ademas verificar que sea valido de 1 a 4, o de 0 a 3 (es mas facil este)Lo siento pero no entiendo muy bien esta parte, entiendo que debo de empezar el primer case en 0 en vez de 1 pero no entiendo lo de verificar que sea valido.
. . | . .
. . | . .
---|---
. . | . .
. . | . .
0000 0100 | 1000 1100
0001 0101 | 1001 1101
----------|----------
0010 0110 | 1010 1110
0011 0111 | 1011 1111
0000 0100 | 1100 1000
0001 0101 | 1101 1001
----------|----------
0011 0111 | 1111 1011
0010 0110 | 1110 1010