De China viene un barco cargaditooooo deeeee .... bits

No me preguntéis por qué pero el código del gran
M.Nocturno no funciona exactamente como está, al menos en mi compilador
CCS C 3.242 ... pero ya lo tengo funcionando con una ligerísima modificacion.
El caso es que las operaciones
posicion/8 para obtener la parte entera o byte donde está alojado el bit a utilizar y
posicion%8 para obtener el resto o posición del bit dentro del byte no parecen funcionar dentro,
embebidas, de las mismas instrucciones de
bit_set,
bit_clear o
bit_test.
Así que lo único que he hecho ha sido hacer estas operaciones fuera, forzándolas a devolver el resultado como
int8 especificándolo así y después utilizar las funciones tal cual están.
int1 get_array_bit(int8 pbit){
int1 r;
int8 a,b;
a = (int8) pbit/8;
b = (int8) pbit%8;
r=bit_test(bits_array[a],b);
return r;
}
int1 set_array_bit(int1 vbit, int8 pbit){
int1 r;
int8 a,b;
a = (int8) pbit/8;
b = (int8) pbit%8;
r=bit_test(bits_array[a],b);
bit_clear(bits_array[a],b);
if(vbit==1) bit_set(bits_array[a],b);
return r;
}Para declarar la variable Array de bytes (los contenedores de los bits) he utilizado la declaración siguiente:
#define bytes_for_bits 5 // 5 * 8 = 40 bits (0..39)
int8 bits_array[bytes_for_bits]; // Array de 40 bits dividido en bytes_for_bits bytesY para poder monitorizar todos los bits dentro de bits_array me he contruido una función que me convierte en string de bits ASCII el byte que le envíe, devolviéndome un puntero a dicho string:
char* int8_to_bits_string(int8 val){
char s[]="00000000";
char* ptr;
int8 i;
for(i=0;i<8;i++) s[ i ]=bit_test(val,i)+'0';
s[8]='\0';
ptr=&s[0];
return ptr;
}Y para comprobar que todo va como debe ir me he contruido en el main() un modo de ir poniendo a 1 cada uno de los bits cada vez que le pulso algo a través del canal serie, y con cada pulsación me muestra el estado de los cuarenta bits. Y cuando llega al bit 39 se reinicializa el índice comenzando de nuevo desde el 0 pero si está ya puesto a 1 lo coloca ahora a 0.
El trozo de código del main es:
if(Command=='1'){ // Next Bit a 1 si 0 ó a 0 si 1
if(get_array_bit(nextbit)==0)
set_array_bit(1,nextbit);
else
set_array_bit(0,nextbit);
printf(">Set bit %2u ",nextbit);
for(i=0;i<bytes_for_bits;i++){
ptr=int8_to_bits_string(bits_array[ i ]);
strcpy(s,ptr);
printf("%s",s);
}
printf("\r\n");
if(++nextbit==bytes_for_bits * 8 ) nextbit=0;
}Y como todo está construido alrededor del define
bytes_for_bits podemos cambiarle el valor y montar el número de bits que queramos, siempre múltiplo de 8.
