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

1

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;

    
pregunta m.Alin

1 respuesta

2

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 número (RB1 & 0x07) o 1 en su ejemplo, la dirección del byte es (RB1 > > 3), o 0x06 en su ejemplo.

    
respondido por el Spehro Pefhany

Lea otras preguntas en las etiquetas