Voy a tomar un microcontrolador de Microchip de 8 bits al azar: PIC16F887 .
Veamos cómo el compilador XC8 (y el PICC HI-TECH, en realidad) está definiendo un registro (SFR) y sus bits correspondientes en el archivo de encabezado del dispositivo ( /opt/microchip/xc8/v1.31/include/pic16f887.h
):
extern volatile unsigned char PORTB @ 0x006;
Entonces, PORTB
SFR se define como una variable volátil de 8 bits con la dirección absoluta 0x006, según la hoja de datos.
Tengo problemas para comprender la definición de un solo bit (bit 1, por ejemplo) correspondiente a PORTB:
extern volatile __bit RB1 @ (((unsigned) &PORTB)*8) + 1;
¿Por qué multiplican la dirección de PORTB por 8?
EDIT:
También busqué una explicación en el manual del compilador y encontré casi las mismas respuestas que Spehro me dio . Debería haber consultado el manual antes de preguntar aquí:
Al definir variables de bit absolutas (consulte la Sección 5.4.2.1 “Datos de bit Tipos y variables ”), la dirección especificada debe ser una dirección de bit. Una dirección de bit se obtiene al multiplicar la dirección de byte deseada por 8, luego agregando el bit offset en ese bit.
Entonces, por ejemplo, para coloque una variable de bit llamada modo en la posición de bit # 2 en la dirección de byte 0x50, use lo siguiente: modo bit @ 0x282; Si desea colocar un poco variable sobre un objeto existente (normalmente esto será un SFR variable u otra variable absoluta) entonces puede usar el símbolo de ese objeto, como en el siguiente ejemplo que coloca la bandera en el bit Posición # 3 en la variable char MOT_STATUS:
bit flag @ ((unsigned) &MOT_STATUS)*8 + 3;