Problema en CCS al pasar cadena de bytes a cadena de bits

#1
Buenos días:

Estoy intentando hacer un programa donde tengo 19 bytes en una cadena (int telemando1[19]) y los intento leer y meter en otra bit a bit (int1 telemandobits[152]). El objetivo es que si tengo en la primera cadena los valores 8,7,.... pasen a la segunda cadena con los valores binarios 0,0,0,0,1,0,0,0, 0,0,0,0,0,1,1,1, ...

El código que tengo es:
Código:
   int telemando1[19];
   int1 telemandobits[152];
   int i,z;

     for (i=0;i==151;i++) //Aqui inicializo la cadena
     {
         telemandobits[i]=0;
     }

        //Estos son los datos que quiero pasar a la otra cadena bit a bit
         telemando1[18]=8;
         telemando1[17]=7;
         telemando1[16]=6;
         telemando1[15]=5;
         telemando1[14]=4;
         telemando1[13]=12;
         telemando1[12]=0;
         telemando1[11]=1;
         telemando1[10]=17;
         telemando1[9]=255;
         telemando1[8]=255;
         telemando1[7]=255;
         telemando1[6]=255;
         telemando1[5]=255;
         telemando1[4]=255;
         telemando1[3]=255;
         telemando1[2]=255;
         telemando1[1]=0;
         telemando1[0]=0;

         //Aquí creo una cadena de bits con todos los datos
         for (i=18;i==0;i--)
         {  for (z=0;z==7;z++)
            {  
               telemandobits[((i+1)*8)-(8-z)]=(int1) telemando1[i];
               telemando1[i]>>=1; // x>>=y, is the same as x=x>>y
            }
         }
Luego leo la cadena telemandobits[] y no tengo los valores 0 y 1 esperados. La verdad es que creo que tiene que ser una tontería que no veo, pero me estoy volviendo loco. :confused::confused:
Alguna sugerencia??

Gracias
 
#2
Creo que en c se puede definir el array directamente como:

int telemando[] = {1,2,3,4,5,6,7,8,9...};

Si lo defines como byte o como char gastarás la mitad de memoria:

char telemando[] = {1,2,3,4,5,6...};

Respecto al algoritmo, lo tengo que pensar, veo un poco confuso el que has puesto.
 
#3
"char telemando[19]" ocupa la mitad que "int telemando[19]"?? Muy interesante.
Sobre definirlo directamente no puedo porque los datos variaran en el programa definitivo.

La verdad es que con el algoritmo me estoy volviendo loco, llevo tres días dándole vueltas, y creo que está bien, pero no funciona.



he cambiado un poco el código

Código:
   char telemando1[19];
   int1 telemandobits[152];
   int i,z;

     for (i=0;i<=151;i++) //Aqui inicializo la cadena
     {
         telemandobits[i]=0;
     }

        //Estos son los datos que quiero pasar a la otra cadena bit a bit
         telemando1[18]=8;
         telemando1[17]=7;
         telemando1[16]=6;
         telemando1[15]=5;
         telemando1[14]=4;
         telemando1[13]=12;
         telemando1[12]=0;
         telemando1[11]=1;
         telemando1[10]=17;
         telemando1[9]=255;
         telemando1[8]=255;
         telemando1[7]=255;
         telemando1[6]=255;
         telemando1[5]=255;
         telemando1[4]=255;
         telemando1[3]=255;
         telemando1[2]=255;
         telemando1[1]=0;
         telemando1[0]=0;

         //Aquí creo una cadena de bits con todos los datos
         for (i=0;i<=18;i++)
         {  for (z=0;z<=7;z++)
            {  
               telemandobits[((i+1)*8)-(8-z)]=(int1) telemando1[i];
               telemando1[i]>>=1; // x>>=y, is the same as x=x>>y
            }
         }
Aun y todo leo la cadena telemandobits[] y tengo 0,1,0,1,0,1,0,1,0,1....

A ver si voy avanzando, pero se admiten sugerencias. Muchas gracias
 
Última edición:
#4
"char telemando[19]" ocupa la mitad que "int telemando[19]"?? Muy interesante.
En cierto modo, recuerda que un registroen la RAM del PIC tiene una longitud mínima de 8 bits y un array del tipo booleano no se maneja tan fácilmente, bueno de ésto se encarga el CCS.

Usa la función "value = bit_test (var, bit)".
 
#5
Bueno, no se que es lo que hace esa versión del C, normalmente
bit o boolean ocupa un bit, eso depende del procesador, en algunos ocupa un byte
char o byte ocupa un byte
int o uint ocupan dos bytes
etc...
ante la duda leed el manual del compilador de C.

Si lo defines de inicio:
telemando[]={1,2,3,4,5...}; haces dos cosas, definir el tamaño y el valor por defecto si es que eso es útil; sin hacer nada ya va el mando de una forma "normal" o "habitual". Después puedes redefinir el array si reprogramas el mando.
 
Arriba