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

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

¿Escriba los primeros 8 bits primero, luego los segundos 8 bits? ¿O está pidiendo que se escriba el código real para usted?
¿ Estás seguro de que a long inttiene solo 16 bits?
@HannoBinder Dijo que estaba usando un int largo para almacenar 16 bits de datos. Podría no estar usando los otros 16 bits y aun así ser 100% correcto en su afirmación. Ineficiente, seguro, pero aún así correcto...

Respuestas (3)

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;
Tuve la tentación de empezar a farfullar sobre los sindicatos, pero este no es el momento, ¿verdad? ;-)
@Asmyldof Es tentador, pero un buen compilador optimizará los fragmentos de cambio de bit a solo una lectura del byte relevante, sin que tenga que preocuparse por el endianismo.
Lo sé, pero los sindicatos son una salsa increíble :-D
Algunos compiladores son lo suficientemente estúpidos como para cambiar por 8 y [O/Y], exactamente como se indica en el código fuente, incluso en un chip de 8 bits con todas las optimizaciones activadas. He usado uniones y notación de punteros para evitar esto, dependiendo de la frecuencia con la que necesito acceder a cada variable de esa manera.
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 bit a bit (&) con un 0xFF para aplicar ese valor a los 8 bits disponibles en el 'int'.

Para los 8 bits inferiores (LSB), no se requiere un cambio de bit, por lo que podemos hacer AND bit a bit para obtener los datos que necesitamos.

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;