Estimados: comparto una propuesta de solución para este ejercicio. Si encuentran un error, comenten.
Explico un poco lo que hice:
El main solo inicializa variables.
La rutina timer() solo se encarga de incrementar la variable tics si el pulso está en 1.
Para almacenar los bits que van llegando uso un buffer (asumí que los bits menos significativos llegan primero)
Este buffer es circular y tiene solo 8 elementos. Esto hace que, si llegan más de 8 bits, los más recientes sobreescriban a los bits más viejos.
Al inicio o tras procesar un byte (por la llegada de una marca), el buffer se pone todo en 0. Esto hace que si llegan menos de 8 bits, el byte de salida tenga ceros a la izquierda.
El mayor trabajo lo hace la rutina flanco():
Si tics = 50 se guarda un 1 en el buffer y si tics = 30 se guarda un 0 en el buffer.
Si tics < 30 ( llegó una marca ) debo procesar el contenido del buffer para construir el byte de salida.
Para ello le doy una vuelta entera al buffer, desde la última posición donde guarde un elemento. Esta recorrida se hace en el sentido opuesto al que fui llenando el buffer. Voy iterando y acumulando en el byte salida.
Por último y antes de terminar flanco(), pongo tics en 0.
Espero que haya quedado claro. Saludos.