Interesante idea, Don Diego, pero tal y como estaba no funciona. El parámetro del rotate es el nº de bytes de la estructura con la que vas a trabajar, y por tanto había que ponerle 4 para un int32. Dejo el código que funciona según tu método (he probado con 3 bytes a partir del segundo para rotar los 24 bits pero no lo he conseguido.)
for (i=0;i<24;i++) {
EsperaFlancoBajada;
Posicion = Posicion + input(PIN_B0);
rotate_right(&Posicion,4);
EsperaFlancoSubida;
}
for (i=0;i<8;i++)
rotate_right(&Posicion,4);
Con este código se compila en 66 instrucciones y 32 iteraciones.
Buscando opciones, he llegado a una que me gusta. Es la siguiente:
for (i=0;i<24;i++) {
EsperaFlancoBajada;
Posicion=Posicion>>1;
if (input(PIN_B0))
Posicion=Posicion+0b100000000000000000000000;
EsperaFlancoSubida;
}
Esta se compila en 48 instrucciones con 24 iteraciones.
De todas formas, miraré de nuevo lo del rotate con sólo 3 bytes, a ver si lo saco.