¿Rompiendo un int de 16 bits de largo para escribir en eeprom?

1

Estoy escribiendo datos en eeprom AT24C16 usando el microcontrolador PIC pic18f4520. Cada dirección de este eeprom puede contener 8 bits mientras estoy usando int largos para almacenar datos que tienen un tamaño de 16 bits. ¿Cómo dividir int largo en 2 partes de 8 bits para escribirlas y cómo volver a unirlas después de leer de eeprom?

    
pregunta prog_SAHIL

3 respuestas

5

En C, puede usar el desplazamiento de bits y el enmascaramiento para extraer cada byte de un número más largo:

lower_8bits = value & 0xff;
upper_8bits = (value >> 8) & 0xff;

Y puede "reensamblar" el número de bytes haciendo lo contrario:

value = (upper_8bits << 8) | lower_8bits;
    
respondido por el Nick Johnson
3
long int my16bitdata = 0xEA51;

int MSB, LSB;

MSB = (my16bitdata>>8) & 0xFF;
LSB = my16bitdata & 0xFF;

En este caso, el resultado sería:

MSB = 0xEA

y

LSB = 0x51 

Explicación:

Al realizar una operación de desplazamiento de bits (> >) en el valor de 16 bits, podemos deslizar los bits superiores hacia la sección inferior. Los 8 de ellos. Luego hacemos un AND (&) a nivel de bits con un 0xFF para aplicar ese valor a los 8 bits disponibles en el 'int'.

Para los 8 bits más bajos (LSB), no se requiere un cambio de bits, por lo que podemos simplemente hacer el bit a bit Y para obtener los datos que necesitamos.

    
respondido por el Sensors
1

Un enfoque de nivel superior que permita al compilador hacer el cambio se vería así:

typedef union Int16
{
  int data;
  struct
  {
    unsigned char lsb;
    unsigned char msb;
  }bytes __attribute__ ((packed));
}Int16 __attribute__ ((packed));
#define MSB bytes.msb    
#define LSB bytes.lsb    

Int16 myInt;
unsigned char msb, lsb;

myInt.data = 0x1234;
msb = myInt.MSB;
lsb = myInt.LSB;
    
respondido por el Alexxx

Lea otras preguntas en las etiquetas