Voy a tomar un microcontrolador Microchip aleatorio de 8 bits: PIC16F887 .
Echemos un vistazo a cómo el compilador XC8 (y el PICC de alta tecnología, para el caso) 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 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 me dio Spehro . Debería haber consultado el manual antes de preguntar aquí:
Al definir variables de bit absolutas (consulte la Sección 5.4.2.1 “Tipos de datos de bit y variables”), la dirección especificada debe ser una dirección de bit. Una dirección de bit se obtiene multiplicando la dirección de byte deseada por 8 y luego sumando el desplazamiento de bit dentro de ese bit.
Entonces, por ejemplo, para colocar una variable de bit llamada modo en la posición de bit #2 en la dirección de byte 0x50, use lo siguiente: modo de bit @ 0x282; Si desea colocar una variable de bit sobre un objeto existente (por lo general, será una variable SFR u otra variable absoluta), puede usar el símbolo de ese objeto, como en el siguiente ejemplo que coloca la bandera en la posición de bit #3 en el char variable MOT_STATUS:
bit flag @ ((unsigned) &MOT_STATUS)*8 + 3;
El direccionamiento de bits utiliza los 3 bits inferiores de la dirección para apuntar al bit dentro de un byte.
Entonces, el bit es el número (RB1 y 0x07) o 1 en su ejemplo, la dirección del byte es (RB1 >> 3) o 0x06 en su ejemplo.
@ (((unsigned) &PORTB)*8) + 1;
Evaluemos esta expresión: &PORTB = 0x06. 0x06 * 8 = 0x30 (0b00110000). 0x30 + 1 = 0x31 (0b00110001). ¿Cómo es 0x31 la dirección del bit 1 de PORTB?
Cisne y
m.alin