Estoy usando el microcontrolador PIC18f. Tengo que escribir una variable entera de 16 bits (2 bytes) que se transformó en una variable de dos caracteres, es decir, escribir cada byte en una dirección consecutiva de EEPROM. Primero tengo que escribir un byte superior (datos de 8 bits) en la EEPROM. No puedo obtener los 8 bits superiores de la variable entera con el siguiente código (donde puedo escribir los ocho bits inferiores de la variable entera). mi codigo es
void int_EEPROM_putc(unsigned char address, unsigned char data);
unsigned char int_EEPROM_getc(unsigned char address);
unsigned char c;
unsigned int d;
unsigned char* e;
unsigned char f;
void main()
{
d=0xffff;
e=(unsigned char*)&d;
//f=*e
f=*(e+1);
int_EEPROM_putc(0x02,f);
delay_ms(100);
c=int_EEPROM_getc(0x02);
while(true)
{
if(c==255)
{
PORTB=~PORTB;
}
else
{
PORTB=0xff;
}
}
El enfoque más general para extraer partes de un valor entero es desplazar y enmascarar. Entonces:
d = whatever;
c = d & 0xff; // extract low 8 bits
c = (d >> 8) & 0xff; // extract next 8 bits
Si, como aquí, sabe que el valor en d es de 16 bits, puede simplificar un poco el código para los siguientes 8 bits escribiendo
c = d >> 8; // extract high 8 bits of 16-bit value
En general... no es una excelente práctica asumir cualquier tamaño de bit o "endian-ness" para cualquier int, por razones de portabilidad. Según el procesador y el compilador, e int puede ser de 8 bits a 64 bits, o incluso algún otro tamaño extraño, y puede almacenarse en formato little-endian o big-endian.
¿Qué pasa si haces cualquiera de estos dos?
if(d==255)
{
}
// or
int d = 0xffff;
d >> 8;
char c = d;
if (c==255)
{
}
d>>8;
no tendrá ningún efecto. Es puramente un valor de mano derecha, no asignado a nada. probablemente quierasd=d>>8;
d >>= 8;
se d = d >> 8;
compilara en un código diferente.
Rdo
c
ser 0xFF, pero no lo es?Rdo
0xFF
, usaría algún valor inicial comod=0xAABB;
para diferenciar los valores.kathir kamu
Rdo
kathir kamu
Rdo
c
su puerto y evaluar el valor.Jugador Grady