Dices que no quieres que salga del bucle con los cambios de velocidad, sólo con los cambios de dirección, pero en tu programa aparece esto:
Codigo:
x=port_a // Leo estado del puerto
xx=0b110000 & x // And lógica para ver estado de los bits que me marcan la direccion
y=0b001111 & x // And logica para ver estado de los bits de velocidad
dutycalculado=y/(16*(1/4000000)) // Calculamos duty
while(x==port_a) // mientras no haya cambios (direccion o velocidad)
{
por lo que saldrá del bucle con cualquier cambio.
Yo probaría a cambiar la condición del bucle por esta otra:
while (xx==(0b110000 & x)) // mientras no haya cambios de dirección
Teóricamente, así sólo debería salir con cambios de dirección.
Para dar marcha atrás habría que saber cómo tienes conectados los motores DC. Supongo que los tendrás colgando de un puente en H, ¿no?