Autor Tema: Alternativa a arreglos de 1 bit  (Leído 10449 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Alternativa a arreglos de 1 bit
« en: 30 de Enero de 2007, 20:50:06 »
Hola

Estoy haciendo un programa en el que necesito guardar muchos unos y ceros en variables de 1bit. La mejor solución es generar un arreglo de 1bit pero en la v3.245 de CCS todavía no se permite hacerlo.

Por ahora no puedo empezar a usar la 4 por todos los bugs que todavía tiene, por eso recurro a ustedes para que me ofrezcan alguna alternativa.

Gracias

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Alternativa a arreglos de 1 bit
« Respuesta #1 en: 31 de Enero de 2007, 02:35:15 »
¿A qué te refieres con "arreglo de 1 bit"?

Yo en CCS sé que funciona lo siguiente:
#bit  led         = PORTB.RB2

pero no sé si será lo que buscas.

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: Alternativa a arreglos de 1 bit
« Respuesta #2 en: 31 de Enero de 2007, 03:21:08 »
Traductor simultáneo  :mrgreen:

arreglo = matriz ó tabla. Arreglo es una traducción literal de la inglesa array

CCS C solo permite arreglos, matrices o tablas de bytes, no de bits.
« Última modificación: 31 de Enero de 2007, 03:23:44 por RedPic »
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Alternativa a arreglos de 1 bit
« Respuesta #3 en: 31 de Enero de 2007, 11:45:51 »
Sí, es que necesito algo así...

int1 bateria[40];

pero ccs 3 no acepta esos arreglos buuu

ya había pensado en lo de #bit pero para acceder secuencialmente a los bits hay que escribir mucho código, se me ocurrió...

int8 bat;

#bit b01 bat.0
#bit b02 bat.1
#bit b03 bat.2
.....

switch(bateriaactual)
{
case 0x01:
b01=1;
break;
case 0x02:
b02=1;
break;
case 0x03:
b03=1;
break;
......

Y si fuera con un arreglo de 1bit...

bateria[bateriaactual]=1;

 :D

Por ahora solucionaré esto con arreglos de 8 bits... aunque desperdiciaré memoria ram (7 bits por byte), pero ahorraré memoria ROM 


« Última modificación: 31 de Enero de 2007, 11:49:40 por migsantiago »

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Alternativa a arreglos de 1 bit
« Respuesta #4 en: 31 de Enero de 2007, 14:13:36 »
Creo que tampoco es tanto código.

Código: [Seleccionar]
int8 bateria[5]; //esto es un array de 5 bytes, o lo que es lo mismo, 40 bits
int8 PosicionALeer; // nº índice del bit a leer
int1 BitLeido; // resultado

BitLeido = bateria[PosicionALeer / 8] >> (PosicionALeer % 8);

Conste que no lo he probado, pero se me ocurre que podría funcionar.

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Alternativa a arreglos de 1 bit
« Respuesta #5 en: 31 de Enero de 2007, 14:43:44 »
Wow Manolo... lo malo es que no entiendo lo de >>... ¿eso qué función hace?

Código: [Seleccionar]
BitLeido = bateria[PosicionALeer / 8] >> (PosicionALeer % 8);
 :oops:

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Alternativa a arreglos de 1 bit
« Respuesta #6 en: 31 de Enero de 2007, 14:55:42 »
Wow Manolo... lo malo es que no entiendo lo de >>... ¿eso qué función hace?

Código: [Seleccionar]
BitLeido = bateria[PosicionALeer / 8] >> (PosicionALeer % 8);
 :oops:

>> es rotar a la derecha y agrega ceros en el bit más significativo.

<< es rotar a la izquierda y agrega ceros en el bit menos significativo.






- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Alternativa a arreglos de 1 bit
« Respuesta #7 en: 31 de Enero de 2007, 15:22:32 »
eeemmmm...

¿entonces rota a la derecha batería? no entiendo todavía  :oops:  :(

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Alternativa a arreglos de 1 bit
« Respuesta #8 en: 31 de Enero de 2007, 15:30:25 »
eeemmmm...

¿entonces rota a la derecha batería? no entiendo todavía  :oops:  :(

Vamos con un ejemplo.


El byte bateria[n] tiene 8 bits.

Si n = 0, sería el primer elemento de tu arreglo de bits.

Por otra parte, si uno quiere el bit nro 12 (que sería la posición 11 ya que el arreglo de bits hacemos que empiece de 0), la función sería así

Bitleido = bateria[11/8] >> (11 % 8)
Bitleido = bateria[1] >> (3)

Si bateria[1] = 0b10001011

// ahora se corre 3 lugares a la derecha
hacer bitleido >> 3 = 0b00010001   


Eso hace que

bitleido = 1






- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Alternativa a arreglos de 1 bit
« Respuesta #9 en: 31 de Enero de 2007, 16:27:04 »
 :shock:

qué ingenioso se vio Manolo  :mrgreen:

Gracias por la explicación Maunix...

solo un detalle... si se asigna un int8 a un int1, ¿siempre asigna el bit menos significativo (bit0)?

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5474
    • Electrónica Didacta
Re: Alternativa a arreglos de 1 bit
« Respuesta #10 en: 31 de Enero de 2007, 16:44:33 »
:shock:

qué ingenioso se vio Manolo  :mrgreen:

Gracias por la explicación Maunix...

solo un detalle... si se asigna un int8 a un int1, ¿siempre asigna el bit menos significativo (bit0)?

para decir un poquito de teoría:

en CCS se puede declarar una variable de 1 bit, sería por ejemplo

short variable

en el manual ccs_c_manual.pdf (actualizado) página 33, dice:

int1 = Defines a 1 bit number  -> short = int1
...
Código: [Seleccionar]
SHORT is a special type used to generate very efficient code for bit operations and I/O.
Arrays of bits (INT1 or SHORT) in RAM are now supported. Pointers to bits are not permitted.

estas variables se pueden usar como señalizadores (true, false).

Salu2
Pedro
La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Alternativa a arreglos de 1 bit
« Respuesta #11 en: 31 de Enero de 2007, 19:08:41 »
Hola Pali

No me refería a qué es un int1 o un bool...  :mrgreen: me refería a si cuando se hace esto...

int8 variable;
int1 variablechica;

variable=0b00000011;
variablechica=variable;

que si variablechica siempre va a almacenar el bit menos significativo, en este caso el 1

« Última modificación: 31 de Enero de 2007, 19:10:19 por migsantiago »

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Alternativa a arreglos de 1 bit
« Respuesta #12 en: 31 de Enero de 2007, 19:37:17 »
No sé cuál será el tratamiento que hará CCS de eso, supongo que sí. Pero es fácil comprobarlo.

Lo que sí sé es que cuando haces un int8 = int16 se queda con el byte menos significativo.

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Alternativa a arreglos de 1 bit
« Respuesta #13 en: 31 de Enero de 2007, 19:44:13 »
Vientos gracias a todos  :-/

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5474
    • Electrónica Didacta
Re: Alternativa a arreglos de 1 bit
« Respuesta #14 en: 01 de Febrero de 2007, 12:56:16 »
No sé cuál será el tratamiento que hará CCS de eso, supongo que sí. Pero es fácil comprobarlo.

Lo que sí sé es que cuando haces un int8 = int16 se queda con el byte menos significativo.

tal como dice Nocturno, habrá que hacer algunas comprobaciones, en el ejemplo prueba a ver si funciona:

Código: [Seleccionar]
variablechica=short(variable)

Salu2
Pedro
La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek


 

anything