Haz una pregunta
  Foros de Electrónica » Diseño digital » Interfaces y Programación
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

29/04/2010 #1


Duda de programacion C
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?
29/04/2010 #2

Avatar de cosmefulanito04

Respuesta: Duda de programacion C
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:

Código:
...
int pepe;
char reg1,reg2;
....
pepe=(reg2<<8)+reg1;
...
30/04/2010 #3


Respuesta: Duda de programacion C
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
30/04/2010 #4

Avatar de Dr. Zoidberg

Respuesta: Duda de programacion C
Zuri dijo: Ver Mensaje
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;

/* o lo que es casi lo mismo...
pepe = ((int)reg2 << 8) | reg1;
considerando a reg2 como el MSB y a reg1 como el LSB */


...
30/04/2010 #5

Avatar de Eduardo

Respuesta: Duda de programacion C
Zuri dijo: Ver Mensaje
.......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.
Código:
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 

................................
................................
13/09/2012 #6


Como combinar portb y portc en una sola variable de 16bits
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
14/09/2012 #7

Avatar de cosmefulanito04

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í:

Código PHP:
....
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.
19/09/2012 #8


Muchas gracias cosmefulanito04
Gracias a funcionado a la perfeccion el codigo final quedo asi:

Código:
#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
}}}
20/09/2012 #9

Avatar de cosmefulanito04

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

Código:
....
         portb =(unsigned char)(registro16&0xff);  //envia registro a puerto b la parte baja
         portc =(unsigned char)(registro16>>8); //envia registro a puertos c la parte alta
...
Respuesta
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Buscar más temas sobre:
Lupa Interfaces y Programación

Lenguajes de programación, gestión y manejo de puertos

Cerrar
Foros de Electrónica » Diseño digital » Interfaces y Programación

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.