Voy a tomar un microcontrolador Microchip de 8 bits al azar: PIC16F887 .
Veamos cómo el compilador del XC8 (y el PICC de HI-TECH, en realidad) define un registro (SFR) y sus bits correspondientes en el archivo de cabecera del dispositivo ( /opt/microchip/xc8/v1.31/include/pic16f887.h
):
extern volatile unsigned char PORTB @ 0x006;
Así que PORTB
El 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 entender 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 PORTB por 8?
EDITAR:
También busqué una explicación en el manual del compilador y encontré más o menos las mismas respuestas que Spehro me dio . Debería haber consultado el manual antes de preguntar aquí:
Cuando se definen variables de bit absolutas (véase la sección 5.4.2.1 "Tipos de datos de bit y Variables"), la dirección especificada debe ser una dirección de bits. Una dirección de bit se obtiene multiplicando la dirección de byte deseada por 8, y luego añadiendo el desplazamiento del bit dentro de ese bit.
Así, por ejemplo, para colocar una variable de bit llamada mode en la posición de bit #2 en la dirección de byte 0x50, utilice lo siguiente: bit mode @ 0x282; Si desea colocar una variable de bit sobre un objeto existente (normalmente será una variable SFR u otra variable absoluta) entonces puedes usar el símbolo de ese objeto, como en el siguiente ejemplo que coloca la bandera en la posición #3 del bit posición #3 en la variable char MOT_STATUS:
bit flag @ ((unsigned) &MOT_STATUS)*8 + 3;