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?
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;
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;
PlasmaHH
jimmyb
long int
tiene solo 16 bits?adam lorenzo