# Duda de programacion C



## Zuri (Abr 29, 2010)

Hola!

Tengo una duda de programación, lo que quiero hacer es lo siguiente:

Leo un registro de 8 bits y lo guardo en un vector de 8 bits. Leo otro registro de 8 bits y lo guardo en un segundo vector. Lo que necesito es, unir los 8+8 bits para pasarlo de complemento a 2 a hexadecimal.

¿Sabeis como puedo hacerlo?


----------



## cosmefulanito04 (Abr 29, 2010)

Ahi algo no parece estar bien, tenes 2 registros de 8 bits y usas 2 vectores de 8 *bits*?

Nunca hice este analisis, pero un vector de 8bits equivale a un byte osea una variable tipo char .

Suponiendo que es eso, y quisieras convertir las 2 variables char en una sola variable, por ej. tipo int; podrias usar un desplazamiento o uniones:


```
...
int pepe;
char reg1,reg2;
....
pepe=(reg2<<8)+reg1;
...
```


----------



## Zuri (Abr 30, 2010)

uint8 x_H,x_L,y_H,y_L,z_H,z_L;

    uint8 readVector[6];   
    uint8 writeVector_1[1] = {0x1A}; 
    uint8 writeVector_2[1] = {0x1D};


    I2cTransfer(I2C_GIR_T1_WRITE , writeVector_1, 1, NULL, 0); // Apunto al registro que nos dice si hay datos nuevos o no
    I2cTransfer(I2C_GIR_T1_WRITE , NULL, 0, readVector, 1); //Leemos con readVector ese registro

    if(readVector[0]&0x01) /* Se mira el registro InterruptStatus (0x1A), todos los bits son 0 menos el ultimo que estará a 1 cuando hay datos para leer, si se cumple la condicion leemos los registros*/
    {
        I2cTransfer(I2C_GIR_T1_WRITE , writeVector_2, 1, NULL, 0); //Apuntamos al primer registro de salida
        I2cTransfer(I2C_GIR_T1_WRITE , NULL, 0, readVector, 6); //Leemos 6 registros


       x_H= readVector[0];
        x_Y= readVector[1];
        y_H= readVector[2];
		y_Y= readVector[3];
        z_H= readVector[4];
        z_Y= readVector[5];



Y lo que quiero es juntar x_H con x_L etc etc etc


----------



## Dr. Zoidberg (Abr 30, 2010)

Zuri dijo:


> Y lo que quiero es juntar x_H con x_L etc etc etc



Y si eso es lo que te han dado acá:


			
				cosmefulanito04 dijo:
			
		

> ...
> int pepe;
> char reg1,reg2;
> ....*pepe=(reg2<<8)+reg1;
> ...


----------



## Eduardo (Abr 30, 2010)

Zuri dijo:


> .......Y lo que quiero es juntar x_H con x_L etc etc etc


Para que preguntás si ni siquiera leés las respuestas . 

La otra forma es con *union* , compartiendo la direccion no hace falta conversión.

```
union RGS { uint16 YH ; struct {uint8 H,Y;}; } x , y , z ;
..........................
..........................

    x.H= readVector[0];
    x.Y= readVector[1];
    y.H= readVector[2];
    y.Y= readVector[3];
    z.H= readVector[4];
    z.Y= readVector[5];

//  Como comparten la direccion de memoria 
//  ya quedan con su valor correespondiente 
//  los registros de 16bit  x.YH , y.YH  y z.YH 

................................
................................
```


----------



## insensible15 (Sep 13, 2012)

Hola e estado buscando la forma de combinar los valors de dos puertos el b y el c en una sola variable de 16 bits para poder hacer un corrimiento hacia la derecha es decir que el valor de mi variable se despliege en los dos puertos de manera simultanea. Encontre que talvez esto se pueda hacer utilizando la funcion Make16(); en css pero no logro hacerla funcionar -.-! estoy utilizando el PIC16F877A  y PCWHD

De antemano muchas gracias


----------



## cosmefulanito04 (Sep 14, 2012)

Hacé el proceso inverso al que puse, supone que vos partir de un "unsigned int" (16 bits, sin signo) a un registro de 8 bits (también sin signos), entonces deberías hacer algo así:


```
....
unsigned int mi_variable_de_16_bit;
.....
puerto_0=(unsigned char)(mi_variable_de_16_bit&0xff);
puerto_1=(unsigned char)(mi_variable_de_16_bit>>8);
...
```

Entonces con eso, por el puerto 0 sale la parte baja y por el puerto 1 la parte alta.


----------



## insensible15 (Sep 19, 2012)

Gracias a funcionado a la perfeccion el codigo final quedo asi:


```
#include <16f887.h>
#use delay(clock=4000000)
#fuses XT,NOWDT
#byte portb=6
#byte portc=7

unsigned int16 registro16;

void main()
{

set_tris_b(0x00); // configura el puerto b de salida
set_tris_c(0x00); // configura el puerto c de salida
registro16=0x8000; //valor inicial de registro
// ciclo principal
while(true)
{
         portb =(unsigned int)(registro16&0xff);  //envia registro a puerto b la parte baja
         portc =(unsigned int)(registro16>>8); //envia registro a puertos c la parte alta
         delay_ms(250);
         registro16>>=1; //corrimiento a la derecha
         if(registro16 == 0) // si el registro es igual a 0
         {
         registro16 = 0x8000; //reinicia registro
}}}
```


----------



## cosmefulanito04 (Sep 20, 2012)

Fijate que tenés mal el casteo, pero el compilador te lo corrige automáticamente, te recomiendo que cambies esto:


```
....
         portb =(unsigned [COLOR="Red"][B]char[/B][/COLOR])(registro16&0xff);  //envia registro a puerto b la parte baja
         portc =(unsigned [COLOR="Red"][B]char[/B][/COLOR])(registro16>>8); //envia registro a puertos c la parte alta
...
```


----------

