TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: micro_pepe en 04 de Mayo de 2009, 17:15:44

Título: rotar un vector
Publicado por: micro_pepe en 04 de Mayo de 2009, 17:15:44
Seria correcto hacer esto:

Código: [Seleccionar]
byte data[2];

shift_left(data,2,bit);

y si es correcto donde quedaria la parte alta y baja de los bit, en data[0]; ? o en data[1]; ?

Un saludo.
Título: Re: rotar un vector
Publicado por: migsantiago en 04 de Mayo de 2009, 18:11:28
Hola Pepe

¿A qué te refieres con parte alta y baja de los bit? Creo que te refieres a en qué parte inserta el bit, data[0] o data [1]. Leyendo el manual de CCS:

Bit 0 of the lowest byte in RAM is treated as the LSB.

Es decir que el bit se insertará en el bit 0 de data[0] si es que usas shift_left(). Si usaras shift_right() entonces el bit se insertará en el bit 7 de data[1], según entiendo.

Esto tiene que ver con la forma en que se almacenan las variables mayores a 8 bits en memoria ram (big endian y little endian).

http://www.ibm.com/developerworks/aix/library/au-endianc/index.html?ca=drs-
Título: Re: rotar un vector
Publicado por: MLO__ en 04 de Mayo de 2009, 22:20:23
Para que funcione la funcion debe ser:

Código: C#
  1. shift_left(&data,2,bit);
Título: Re: rotar un vector
Publicado por: migsantiago en 04 de Mayo de 2009, 22:29:56
No MLO. La función está bien escrita por Pepe.

data es un arreglo y si se usa 'data' es la dirección ram del primer elemento del arreglo. Si se quisiera usar con ampersand sería así:

Código: [Seleccionar]
shift_left(&data[0],2,bit);
'data' a secas es un apuntador.
Título: Re: rotar un vector
Publicado por: MLO__ en 04 de Mayo de 2009, 23:26:29
Ah.

Claro, yo la tengo dentro de un for

Código: C#
  1. for(l=0;l<=31;l++)
  2.                 {
  3.                         #ifndef PRUEBA
  4.                         output_bit(DATA, shift_left(&row_aux[k],4,0));
  5.                         #else
  6.                         off(DATA);
  7.                         #endif
  8.                         off(CLK);
  9.                         on(CLK);       
  10.                 }

Ahi si es necesario el &.

Ok.
Título: Re: rotar un vector
Publicado por: migsantiago en 05 de Mayo de 2009, 11:36:39
Exacto, con índice sí lleva ampersand.  :mrgreen:
Título: Re: rotar un vector
Publicado por: micro_pepe en 06 de Mayo de 2009, 18:50:19
Gracias por las respuestas.

Con la instruccion de rotacion, se rotan 16 bit, me referia de esa palabra de 16 bit, donde queda el bit de menos peso, b0 y donde el de mayor peso, b15.

De la respuesta de migsantiago deduzco que el bo es el bo de data[0], y el b15 el b7 de data[1].

Saludos.
Título: Re: rotar un vector
Publicado por: migsantiago en 06 de Mayo de 2009, 21:18:22
Sí, el bit 0 de data[0] es el que entra con shift_left().
Título: Re: rotar un vector
Publicado por: micro_pepe en 07 de Mayo de 2009, 17:49:02
Sigo con los vectores, no he querido abrir otro hilo. La duda es si seria correcto hacer esto:

definir la variable:

int1 dato[16];

operar con el vector de bit, y despues usar 'dato' como una variable tipo int16:

por ejemplo  dato=0x1234;

Un saludo.
Título: Re: rotar un vector
Publicado por: migsantiago en 07 de Mayo de 2009, 19:34:16
CCS no permite arreglos de bits en su versión 3.x. No sé si ya se pueda en la 4.x.

EDITO:

A partir de alguna versión que salió en junio 2008 ya se pueden usar arreglos de bits.  :-/

Citar
Arrays of
bits (INT1) in RAM are now  supported.  Pointers to bits are not permitted.
Título: Re: rotar un vector
Publicado por: MLO__ en 07 de Mayo de 2009, 22:22:07
Sera que algun dia se podra apuntar a una constante? o eso queda solo en mi imaginacion.