Autor Tema: Variable de 32 bits  (Leído 3172 veces)

0 Usuarios y 3 Visitantes están viendo este tema.

Desconectado rachelies

  • PIC12
  • **
  • Mensajes: 65
Variable de 32 bits
« en: 18 de Mayo de 2011, 04:39:39 »
Hola:
Para un programa necesitaría declarar una variable como 32 bits (int32), pero luego necesito poder acceder a cada byte de esa variable, no se si me explico bien.

Por ejemplo declaro una variable:   int32 leds;

pero luego poder acceder al primer byte con leds1, al segundo byte con leds2, etc....
¿Alguien me puede dar una pista? Gracias

Desconectado rachelies

  • PIC12
  • **
  • Mensajes: 65
Re: Variable de 32 bits
« Respuesta #1 en: 18 de Mayo de 2011, 05:11:32 »
Yo mismo me respondo, que ya lo he logrado:

          int32 leds;
   #locate leds=0x50
   #byte leds1=0x50
   #byte leds2=0x51
   #byte leds3=0x52

Era más fácil de lo que pensaba.
Saludos

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Variable de 32 bits
« Respuesta #2 en: 18 de Mayo de 2011, 05:37:44 »
También puedes echar un vistazo a las funciones make8() y make32()

Desconectado LoPiTaL

  • PIC12
  • **
  • Mensajes: 73
Re: Variable de 32 bits
« Respuesta #3 en: 18 de Mayo de 2011, 07:20:14 »
          int32 leds;
   #locate leds=0x50
   #byte leds1=0x50
   #byte leds2=0x51
   #byte leds3=0x52

No sé yo eso cuánto de portable sea. Si quisiesses cambiar de micro, tal vez te daría problemas.
Yo prefiero hacerlo siguiendo C estándar, y para este caso usando punteros:

uint32 leds;
uint8 miByte;

miByte=*((uint8 *)&leds+N); //N va de 0 a 3, en función del byte al que quieras acceder

No sé si me falta algún paréntesis, está escrito directamente sobre el foro.
Explicación de la línea anterior: accede a la posición de memoria de leds interpretándolo como un uint8 y desplázate N bytes. Finalmente, toma el contenido de la posición de memoria resultante.
Otra cosa, te recomiendo, si accedes a bytes, que utilices variables sin signo, para que el byte más significativo no se vea afectado por éste.
Un saludo,
LoPiTaL
Hoy soy yo quién pregunta. Mañana seré quien conteste...

Desconectado hector.ar

  • PIC10
  • *
  • Mensajes: 22
Re: Variable de 32 bits
« Respuesta #4 en: 18 de Mayo de 2011, 08:19:10 »
En C tambien puede hacer una union, dentro de ella declaras una variable entera (long) y un array de tres caracteres o bytes. Ambas variables comparten la direccion de memoria, trabajas con la entera long y lees cada byte con el array.
Saludos!
Héctor

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Variable de 32 bits
« Respuesta #5 en: 18 de Mayo de 2011, 10:44:41 »
Creas una union:

union{
     INT32  Val;
     struct{
        INT8  LB;
        INT8  HB;
        INT8  UB;
        INT8  MB;
     };
}Variable;


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado hector.ar

  • PIC10
  • *
  • Mensajes: 22
Re: Variable de 32 bits
« Respuesta #6 en: 18 de Mayo de 2011, 21:04:58 »
La union que sugiere Suky (usando una estructura en lugar de un array) es correcta tambien:


Citar
union{
     INT32  Val;
     struct{
        INT8  LB;
        INT8  HB;
        INT8  UB;
        INT8  MB;
     };
}Variable;


El uso de uno u otro, depende de que quieras hacer con los bytes individuales, con la estructura tienes la ventaja de poder utilizar nombres diferentes para cada byte individual haciendo mas legible el código, como bien puso Suky. La ventaja de usar un array esta en el hecho de tener un índice, que facilita ciertas rutinas, para direccionar cada byte individual. Asi quedaría usando un array:

union{
     INT32  Val;
     unsigned char octeto[4];
 }Variable;

Saludos!
Héctor

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: Variable de 32 bits
« Respuesta #7 en: 18 de Mayo de 2011, 23:27:22 »
Hola, igual sería bueno especificar con que compilador se pretende la solución, si bien la solución que plantea Suky es la mejor C no permite estructuras anónimas.

Saludos !

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Variable de 32 bits
« Respuesta #8 en: 19 de Mayo de 2011, 00:54:12 »
Hola, igual sería bueno especificar con que compilador se pretende la solución, si bien la solución que plantea Suky es la mejor C no permite estructuras anónimas.

Saludos !

Por lo que veo se trata de CCS asi que C queda de lado  :mrgreen:

Saludos
No contesto mensajes privados, las consultas en el foro

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Variable de 32 bits
« Respuesta #9 en: 23 de Mayo de 2011, 14:36:43 »
Hola, igual sería bueno especificar con que compilador se pretende la solución, si bien la solución que plantea Suky es la mejor C no permite estructuras anónimas.

Saludos !

El C18 si permite estructuras anónimas en las uniones, no así en estructuras con estructuras dentro.

Yendo al grano, esto es válido y compilará sin errores en C18

Código: [Seleccionar]




typedef union {
  unsigned int mivalor;
  struct {
     unsigned char queseyo;
     unsigned char ahoraveo;
  };
  struct {
     unsigned miprimerbit:1;
     unsigned:7;
  };
} Tmiunion;



Estructura anónima dentro de una estructura, esto no compilará.  

Código: [Seleccionar]
typedef struct {
  unsigned int mivalor;
  struct {
     unsigned char queseyo;
     unsigned char ahoraveo;
   };
  struct {
     unsigned miprimerbit:1;
     unsigned:7;
  };
} Tmistruct

La razón por la que una funciona y la otra no, es sencilla.  Para el compilador en una unión, la ubicación de cada estructura o su denominación le es indistinta ya que al acceder a queseyo estará también accediendo al primer valor de mivalor o lo que es lo mismo estará seteando el bit miprimerbit

En cambio cuando se hace una estructura de estructuras, es importante saber a cual estructura se quiere acceder , de allí que las estructuras de estructuras no pueden ser anónimas.

Las estructuras anónimas son de enorme utilidad para problemas como el caso del requerimiento de rachelies pero tamibén para drivers de algún periférico donde por ejemplo, a veces queremos setear un valor de un sencillo bit, pero en ocasiones queremos acceder a sus valores como bytes completos pero queremos que al modificar el bit, también se modifique el byte y viceversa.

- 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)


 

anything