1 votos

En cuanto a los registros y definiciones de bits del compilador de Microchip XC8

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;

2voto

Spehro Pefhany Puntos 90994

El direccionamiento por bits utiliza los 3 bits inferiores de la dirección para señalar el bit dentro de un byte.

Así que el bit es el número (RB1 & 0x07) o 1 en su ejemplo, la dirección del byte es (RB1 >> 3), o 0x06 en su ejemplo.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X