Con respecto a los registros y definiciones de bits del compilador Microchip XC8

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 PORTBSFR 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;

@Swanand Sí, usan uniones y estructuras para definir los bits del registro. Los compiladores de Microchip también hacen eso, además de las definiciones que mencioné.

Respuestas (1)

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.

Creo que no entiendo tu explicación. Tome la expresión de la definición de bits: @ (((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?
El compilador sabe a qué tipo de objeto (bit) apunta la dirección y lo trata de manera diferente a una dirección de byte. Intente mirar el código de máquina emitido para obtener declaraciones muy simples de establecimiento/borrado de bits.